【发布时间】:2021-08-06 23:29:28
【问题描述】:
我有一个 WPF DataGrid,ItemsSource 属性绑定到视图模型。
单击按钮时,方法正在对 DataGrid 的选定行进行操作。
工作完成后,我想从视图模型中取消选择 DataGrid 的所有行,如何以 MVVM 方式实现?
XAML:
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding ObCol_View}"
SelectedItem="{Binding SelectedItem}
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<GalaCmd:EventToCommand Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding SelectedItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
<Button Content="Apply" Command="{Binding PerformCommand}"/>
视图模型
public class ViewModelprices_manager<T> : WindowViewModel
{
public ViewModelprices_manager()
{
SelectionChangedCommand = new RelayCommand<IList>
(items =>
{
SelectedItems = items;
}
);
myObCol_View = new ObservableCollection<View_prices_manager<T>>();
}
public IList SelectedItems { get; set; }
private readonly ObservableCollection<View_prices_manager<T>> myObCol_View;
public ObservableCollection<View_prices_manager<T>> ObCol_View_Parametric { get { return myObCol_View; } }
public RelayCommand<IList> SelectionChangedCommand
{
get;
private set;
}
private RelayCommand myPerformCommand;
public RelayCommand PerformCommand
{
get
{
if (myPerformCommand == null)
myPerformCommand = new RelayCommand(PerformCommandAction);
return myPerformCommand;
}
}
private void PerformCommandAction()
{
perform();
}
public void perform()
{
foreach (View_prices_manager<T> item in SelectedItems)
{
item.Price *= ratio;
}
//DataGrid.UnselectAll <-- Here I want to unselect all to reset the selection in SelectedItems
}
}
【问题讨论】:
-
您正在使用 SelectedItems 列表。在此属性中,您有一个指向 DataGrid.SelectedItems 的链接。处理完后,只需要清空这个列表
SelectedItems.Clear()即可。另外,在我看来,您对 SelectionChangedCommand 的实现并不完全正确。它的唯一功能是获取 SelectedItems 列表。但是这个列表在 DataGrid 中没有改变。只有其中的元素被更改(添加、删除)。因此,在 DataGrid 初始化(或加载)之后弹出一次这个列表就足够了。 -
这个实现的原因是 SelectedItems 属性是只读属性。即使启用了 EnableRowVirtualization 属性,此实现也允许我获取选定项。也可以通过一种行为来做到这一点。所以 SelectedItems.Clear() 对 DataGrid 的选择没有影响。
-
我明白了,你是对的!我确实误会了。可惜这个话题已经关闭了。
-
向问题添加澄清细节并要求打开它。或者创建一个新主题,但不是重复的,而是包含所有指定细节,包括所有自定义类型的实现(以简化的形式)。这样其他人就可以将您的代码复制到他们的项目中并运行它。
-
话题重开,想看看你的解决方案,非常感谢!
标签: c# wpf mvvm binding datagrid