2015-09-08 4 views
0

У меня есть DataGrid (ItemsSource является ObservableCollection) с DataGridCheckBoxColumn определяется как например:WPF DataGridCheckBoxColumn в не обновляется с ViewModel

<DataGrid AutoGenerateColumns="False" 
      SelectionUnit="FullRow" 
      CanUserAddRows="False" 
      CanUserResizeColumns="False" 
      CanUserResizeRows="False" 
      IsReadOnly="True" 
      SelectionMode="Single" 
      ItemsSource="{Binding SearchResult, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"> 
<!--additional columns--> 
<DataGridCheckBoxColumn Header="Add" 
         IsReadOnly="False" 
         Binding="{Binding Path=IsSelected, Mode=TwoWay, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}"> 
</DataGrid> 

Наручники работают отлично в одном направлении, ViewModel может видеть изменения в коллекции, но она не работает в другом направлении. Конечно, я могу повторно инициализировать коллекцию после ее обновления, но это, конечно, испортило порядок сортировки.

List<int> Ids = new List<int>(); 
foreach (var result in SearchResult) // binding source, of type ObservableCollection 
{ 
    if (result.IsSelected) 
    { 
     Ids.Add(result.Id); 
     result.IsSelected = false; // should uncheck the corresponding DataGridCheckBoxColumn cell 
    } 
} 
//SearchResult = new ObservableCollection<SearchSeries>(SearchResult); // does the job but rearranges the sorting 
//RaisePropertyChanged("SearchResult"); // doesn't work either 

Я использую VS 2013 и новейший доступный инструментарий MVVM Light Toolkit.

+0

Вы поднимаете измененное событие свойства, когда IsSelected изменен из ViewModel? –

+0

Не должна ли строка RaisePropertyChanged («SearchResult») сделать это, если я не ошибаюсь? IsSelected является свойством членов SearchResult. – Venom

+0

В наборе IsSelected вы должны иметь RaisePropertyChanged («IsSelected») –

ответ

0

Решение должно было вызвать RaisePropertyChanged() в сеттере IsSelected, как предложил @Glen Thomas. Прошло несколько дней с тех пор, как я задал этот вопрос и не работал над моим проектом. Это был единственный член типа ObservableCollection, который не вызывал вышеупомянутый метод, что приводило к невозможности «обновить» DataGrid.
Свойство IsSelected фактически находится в частичном классе, который расширяет класс, сгенерированный при добавлении ссылки на веб-службу (файл Reference.cs). Все остальные настройки свойств вызывают RaisePropertyChanged().

namespace Example.Client.ExampleService 
{ 
    public partial class Search // the rest of the definition is in Reference.cs 
    { 
     private bool _isSelected; 

     public bool IsSelected 
     { 
      get { return _isSelected; } 
      set 
      { 
       _isSelected = value; 
       RaisePropertyChanged("IsSelected"); 
      } 
     } 
    } 
} 
0

Первый DataGridCheckBoxColumn должен быть введен в DataGrid.Columns так:

<DataGrid > 
    <DataGrid.Columns> 
    <DataGridCheckBoxColumn /> 
    </DataGrid.Columns> 
</DataGrid> 

Второй SearchSeries следует осуществлять INotifyPropertyChanged.

Надеюсь помочь вам.

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