【问题标题】:WPF DataGridCheckBoxColumn's state doesn't get updated from the ViewModelWPF DataGridCheckBoxColumn 的状态未从 ViewModel 更新
【发布时间】:2015-09-08 20:45:47
【问题描述】:

我有一个 DataGrid(ItemsSource 是一个 ObservableCollection),它的 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>

绑定在一个方向上工作正常,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。

【问题讨论】:

  • 当 IsSelected 从 ViewModel 更改时,您是否会引发属性更改事件?
  • 如果我没记错的话,RaisePropertyChanged("SearchResult") 行不应该这样做吗? IsSelected 是 SearchResult 成员的属性。
  • 在 IsSelected 集合中你应该有 RaisePropertyChanged("IsSelected")
  • 不工作,很遗憾。
  • 我尝试将其他列更新为任意值,效果很好。我不明白。

标签: c# wpf mvvm datagrid


【解决方案1】:

首先应将DataGridCheckBoxColumn 放入DataGrid.Columns,如下所示:

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

第二个SearchSeries应该实现INotifyPropertyChanged

希望能帮到你。

【讨论】:

    【解决方案2】:

    解决方案是按照@Glen Thomas 的建议在 IsSelected 的设置器中调用 RaisePropertyChanged()。自从我提出这个问题以来已经有几天了,并且在此期间没有在我的项目上工作。 它是 ObservableCollection 类型中唯一没有调用上述方法的成员,导致 DataGrid 无法“刷新”自身。
    IsSelected 属性实际上位于部分类中,该类扩展了添加 Web 服务引用(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");
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2017-06-07
      相关资源
      最近更新 更多