2015-09-08 64 views
0

更新我有一個DataGrid(的ItemsSource是一個ObservableCollection)被定義爲這樣一個DataGridCheckBoxColumn:WPF DataGridCheckBoxColumn的狀態沒有得到來自視圖模型

<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> 

綁定在一個方向做工精細,視圖模型可以看到收集中的變化,但不適用於其他方向。當然,我可以在更新後重新初始化集合,但是當然,這會弄亂排序順序。

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

解決的辦法是調用IsSelected的setter中的RaisePropertyChanged(),作爲@Glen Thomas的建議。自從我提出這個問題已經過了幾天,並且在此期間我的項目無法正常工作。 它是ObservableCollection類型的唯一成員,它沒有調用上述方法,導致DataGrid無法「自我刷新」。
IsSelected屬性實際上位於擴展添加Web服務引用(Reference.cs文件)時生成的類的部分類中。所有其他屬性的setter調用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

希望能幫到你。