C# WPF Datagrid-如何在一行中进行更改以影响其他行

C# WPF Datagrid-如何在一行中进行更改以影响其他行,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我有一个绑定到项对象集合的WPF数据网格。datagrid有一个复选框列。我希望实现它,以便在选中/取消选中任何行的复选框时,选中/取消选中所有其他行。有没有一种好的MVVM方法可以做到这一点 XAML <DataGrid ItemsSource="{Binding Items}"> <DataGrid.Columns> <DataGridCheckBoxColumn Binding="{Binding MyProperty}" />

我有一个绑定到项对象集合的WPF数据网格。datagrid有一个复选框列。我希望实现它,以便在选中/取消选中任何行的复选框时,选中/取消选中所有其他行。有没有一种好的MVVM方法可以做到这一点

XAML

<DataGrid ItemsSource="{Binding Items}">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Binding="{Binding MyProperty}" />
    <DataGrid.Columns>
</DataGrid>

C#

公共类DataGridViewModel
{
公共ObservableCollection项{get;set;}
}
公共类项目
{
public bool MyProperty{get;set;}//set all Item.MyProperties(如果设置了任何项)
}
基于:

将其用作数据项:

public class Selectable<T>: ViewModelBase //ViewModelBase should Implement NotifyPropertyChanged.
{
    private T _model;
    public T Model 
    {   get { return _model; }
        set 
        {
            _model = value;
            NotifyPropertyChange("Model");
        }
    }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            NotifyPropertyChange("IsSelected");

            if (OnIsSelectedChanged != null)
                OnIsSelectedChanged(this);
        }
    }

    public Action<Selectable<T>> OnIsSelectedChanged;
 }
公共类可选:ViewModelBase//ViewModelBase应实现NotifyPropertyChanged。
{
私有T_模型;
公共T模型
{获取{返回_模型;}
设置
{
_模型=价值;
NotifyPropertyChange(“模型”);
}
}
私立学校当选;
公选学校
{
获取{return}isSelected;}
设置
{
_isSelected=值;
NotifyPropertyChange(“IsSelected”);
if(OnIsSelectedChanged!=null)
OnIsSelectedChanged(此);
}
}
已选定的公共行动已更改;
}
然后将ViewModel更改为如下所示:

public class DataGridViewModel
{
    public ObservableCollection<Selectable<Item>> Items { get; set; }

    public void SomeMethod()
    {
       Items = new ObservableCollection<Selectable<Item>>();

       //Populate the Collection here!

       foreach (var item in Items)
           item.OnIsSelectedChanged = OnItemSelectedChanged;
    }

    private void OnItemSelectedChanged(Selectable<Item> item)
    {
       if (item.IsSelected)
       {
           var itemsToDeselect = Items.Where(x => x != item);

           foreach (var itemToDeselect in itemsToDeselect)
               itemToDeselect.IsSelected = false;
       }
    }
}
公共类DataGridViewModel
{
公共ObservableCollection项{get;set;}
公共方法()
{
Items=新的ObservableCollection();
//在这里填充集合!
foreach(项目中的var项目)
item.OnIsSelectedChanged=OnIsSelectedChanged;
}
private void OnItems SelectedChanged(可选项)
{
如果(项目.已选定)
{
var itemsToDeselect=Items.Where(x=>x!=item);
foreach(变量itemToDeselect在itemToDeselect中)
itemToDeselect.isselect=false;
}
}
}