2011-01-05 4 views
10

Tôi có một mảng bool có kích thước 4 và tôi muốn liên kết từng ô với một điều khiển khác. mảng bool này đại diện cho 4 trạng thái (false = failure, true = success). mảng bool Đây là một propery với một lớp:Làm thế nào để đạt được chức năng INotifyPropertyChanged cho các giá trị trong một bool []?

class foo : INotifyPropertyChanged { 
... 
private bool[] _Statuses; 
public bool[] Statuses 
{ 
    get {return Statuses;} 
    set { 
      Statuses = value; 
      OnPropertyChanged("Statuses"); 
     } 
} 

Trong XAML có 4 điều khiển, mỗi người bị ràng buộc vào một tế bào của mảng:

... Text="{Binding Path=Statuses[0]}" ... 
... Text="{Binding Path=Statuses[1]}" ... 
... Text="{Binding Path=Statuses[2]}" ... 
... Text="{Binding Path=Statuses[3]}" ... 

Vấn đề là các thông báo sự kiện là chỉ được nâng lên khi tôi thay đổi chính mảng đó và không được nâng lên khi tôi thay đổi một giá trị trong mảng đó, tức là, dòng mã tiếp theo sẽ làm tăng sự kiện:

nhưng dòng tiếp theo không tăng ngay cả t:

Statuses [0] = true; 

Làm cách nào để tăng sự kiện mỗi khi một ô bị thay đổi?

Trả lời

3

Nó không làm tăng sự kiện vì bản thân số Array không thực hiện INotifyPropertyChanged. Bạn có thể sử dụng một vùng chứa khác với mảng nguyên thủy (bất kỳ thứ gì triển khai INotifyCollectionChanged thích ObservableCollection<T> nên làm) HOẶC bạn phải gọi RaisePropertyChanged("Statuses") mỗi lần bạn cập nhật mảng Trạng thái OR, như được đo trong câu trả lời khác, sử dụng một lớp thực hiện INotifyPropertyChanged 4 thuộc tính.

+0

Vâng, sử dụng ObservableCollection sẽ là cách đơn giản nhất để đi. –

+0

'ObservableCollection ' không thông báo khi giá trị của bất kỳ mục nào bên trong nó được thay đổi. – decyclone

+0

@decyclone: ​​nó thông báo nếu mục thứ n của bộ sưu tập được di chuyển, thay thế, vv, đó là những gì mã OP làm. Bạn đúng ở chỗ điều này sẽ không xử lý trường hợp T có các thuộc tính và không thực hiện INotifyPropertyChanged, nhưng tôi đã xem xét điều đó ngoài phạm vi của câu hỏi. –

1

Bạn không thể làm điều đó trong khi sử dụng Array. Việc thay đổi giá trị tại bất kỳ chỉ mục nào trên số Array không làm tăng thông báo thay đổi theo yêu cầu của UI.

Thay vào đó, bạn có thể sử dụng lớp học với bốn thuộc tính triển khai giao diện INotifyPropertyChanged không?

8

Bạn cần hiển thị trạng thái của mình làm người lập chỉ mục, sau đó tăng sự kiện thay đổi thuộc tính cho biết rằng người lập chỉ mục đã thay đổi.

private bool[] _Statuses; 

public bool this[int index] 
{ 
    get { return _Statuses[index]; } 
    set 
    { 
     _Statuses[index] = value; 

     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(Binding.IndexerName)); 
    } 
} 

Xem bài viết trên blog này:

http://10rem.net/blog/2010/03/08/wpf---silverlight-quick-tip-inotifypropertychanged-for-indexer

+0

Bạn đã bỏ lỡ dấu ngoặc đơn khi bạn tăng sự kiện đã thay đổi thuộc tính. – Marshall777

+0

@ Marshall777 cảm ơn - đã khắc phục sự cố :-) – ColinE