2014-09-07 2 views
3

У меня есть ObservableCollection, как это,C# Wpf Редактирование Datagrid не обновляет это ItemSource

ObservableCollection<Item> Found_Items = new ObservableCollection<Item>(); 

public struct Item 
     { 
      public bool Enabled { get; set; } 
      public BitmapImage ItemIcon { get; set; } 
      public string Path { get; set; } 
      public string Size { get; set; } 
     } 

Я устанавливаю ItemSource DataGrid как это,

FoundItemsDatagrid.ItemsSource = Found_Items; 

У меня есть флажок в Datagrid, как это ,

<DataGridTemplateColumn Header="Path" Width="*" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DockPanel> 
          <CheckBox IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>       
         </DockPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

Я хочу, когда я проверить или снимите флажок на сетке он должен обновить ObservableCol разночтение.

Что такое самый простой способ сделать это?

Спасибо ..

ответ

2

Проблема в том, как вы привязываетесь к своей коллекции. Вы устанавливаете ItemsSource явно, поэтому ObservableCollection не будет работать так, как вы этого хотите.

Вместо использования связывания следующим образом:

<DataGridTemplateColumn Header="Path" Width="*" ItemsSource="{Binding Found_Items}" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DockPanel> 
          <CheckBox IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>       
         </DockPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

Затем убедитесь, что вы делаете это в фоновом режиме:

public ObservableCollection<Item> Found_Items {get; set;} 

Для изменения каждого элемента должны быть отражены вам нужно использовать INotifyPropertyChanged как так:

public class Item : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private bool enabled; 
     private BitmapImage itemIcon; 
     private string path; 
     private string size; 


     public string Size 
     { 
      get { return size; } 
      set 
      { 
       size = value; 
       if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Size")); 
      } 
     } 


     public string Path 
     { 
      get { return path; } 
      set 
      { 
       path = value; 
       if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Path")); 
      } 
     } 


     public BitmapImage ItemIcon 
     { 
      get { return itemIcon; } 
      set 
      { 
       itemIcon = value; 
       if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ItemIcon")); 
      } 
     } 



     public bool Enabled 
     { 
      get { return enabled; } 
      set 
      { 
       enabled = value; 
       if(PropertyChanged!=null) PropertyChanged(this,new PropertyChangedEventArgs("Enabled")); 
      } 
     } 

    } 

Теперь, когда пользователь меняет объект, изменение можно увидеть в t он ObservableCollection. Это благодаря INotifyPropertyChanged.

+0

Пока ваше исправление работает, ваше объяснение неверно. Нет ничего плохого в настройке ItemsSource на ObservableCollection в коде, это будет работать нормально. Проблема заключалась в том, что он использовал структуру, поэтому привязка обновляла * копию * элемента в коллекции. – Zarat

2

Я следовал инструкциям HERE.

Я изменил «Item» struct на класс «Item», как это;

public class Item : INotifyPropertyChanged 
{ 
    private bool _Enabled; 
    private BitmapImage _ItemIcon; 
    private string _Path; 
    private string _Size; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public Item(bool enabled, BitmapImage itemIcon, string path, string size) 
    { 
     _Enabled = enabled; 
     _ItemIcon = itemIcon; 
     _Path = path; 
     _Size = size; 
    } 

    public bool Enabled 
    { 
     get { return _Enabled; } 
     set 
     { 
      _Enabled = value; 
      this.NotifyPropertyChanged("Enabled"); 
     } 
    } 

    public BitmapImage ItemIcon 
    { 
     get { return _ItemIcon; } 
     set 
     { 
      _ItemIcon = value; 
      this.NotifyPropertyChanged("ItemIcon"); 
     } 
    } 

    public string Path 
    { 
     get { return _Path; } 
     set 
     { 
      _Path = value; 
      this.NotifyPropertyChanged("Path"); 
     } 
    } 

    public string Size 
    { 
     get { return _Size; } 
     set 
     { 
      _Size = value; 
      this.NotifyPropertyChanged("Size"); 
     } 
    } 



    private void NotifyPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 

Everyting works perfect now.

+2

Это на самом деле более правильно, чем принятый ответ. Проблема действительно заключалась в том, что Item был структурой. Использование structs приведет к тому, что WPF обновит * копию * элемента, и, следовательно, исходный элемент в коллекции останется нетронутым. – Zarat

Смежные вопросы