2017-02-03 8 views
-3

INotifyPropertyChangedを実装するのはどのようなコードですか?あなたは、単に実行時にソースコレクションから項目を追加および削除できるようにしたい場合は、INotifyPropertyChangedインターフェイスを実装するために必要はありませんのでINotifyPropertyChangedを実装する用途は何ですか?

<DataGrid ItemsSource="{Binding Items}" 
      AutoGenerateColumns="False"> 
    <DataGrid.Columns> 

     <DataGridTextColumn Header="Name" 
          Binding="{Binding Name}"/> 

     <DataGridComboBoxColumn Header="Color" 
           SelectedItemBinding="{Binding Color}"> 
      <DataGridComboBoxColumn.ElementStyle> 
       <Style TargetType="ComboBox"> 
        <Setter Property="ItemsSource" Value="{Binding Colors}"/> 
       </Style> 
      </DataGridComboBoxColumn.ElementStyle> 
      <DataGridComboBoxColumn.EditingElementStyle> 
       <Style TargetType="ComboBox"> 
        <Setter Property="ItemsSource" Value="{Binding Colors}"/> 
       </Style> 
      </DataGridComboBoxColumn.EditingElementStyle> 
     </DataGridComboBoxColumn> 
    </DataGrid.Columns> 
</DataGrid> 

<Button Content="Change Colors" Click="Change"/> 

    public class Data 
    { 
     private ObservableCollection<Item> _items; 
     public ObservableCollection<Item> Items 
     { 
     get { return _items; } 

     } 

     public Data() 
     { 
     _items = new ObservableCollection<Item>(); 
     _items.Add(new Item() { Name = "A" }); 
     _items.Add(new Item() { Name = "B" }); 
     } 

     public void Change() 
     { 
     _items[0].Colors.RemoveAt(1); 
     } 
    } 

    public class Item 
    { 
     public string Name { get; set; } 
     public string Color { get; set; } 


     private IList<string> _colors; 
     public IList<string> Colors 
     { 
     get { return _colors; } 
     } 


     public Item() 
     { 
     _colors = new List<string> { "Green", "Blue" }; 
     Color = _colors[0]; 
     } 
    } 
+2

プロパティが変更されたときに通知します。静的データの場合は、実際には役に立たない。参考までに、ObservableCollectionは既にINotifyPropertyChangedを実装しているため、データが変更されたときにそのまま動作します。 – Kilazur

+0

データがロードされた後にデータを変更し、UIにその変更が表示されているかどうか確認してください – Pikoh

+2

ObservableCollectionはINotifyPropertyChangedを実装しています[MSDN](https://msdn.microsoft.com/en-us/library/ms668604(v = vs.100).aspx) – Equalsk

答えて

4

ObservableCollection<T>INotifyCollectionChangedINotifyPropertyChangedインタフェースを実装しています。

たとえばNameまたはColorプロパティを動的に更新できるようにするには、カスタムItemクラスに実装する必要があります。

あなたが新しい値にItemNameプロパティを設定した場合ItemクラスがINotifyPropertyChangedインターフェイスを実装し、NameプロパティのセッターでPropertyChangedイベントを発生させない限り、これはビューに反映されません。

コレクションが変更されたときにカスタム機能を使用する場合はどうすればいいですか。たとえば、メッセージを投げる! ObservableCollectionの代わりにListを使用し、そのメッセージをプロパティの `set 'にスローする必要がありますか?

CollectionChangedイベントの処理には、ObservableCollection<T>を使用できます。

+0

ありがとう! – Vahid

関連する問題