我一直在试图弄清楚如何将这种自定义行为转换为数据网格,而在网上搜索解决方案时看起来并不多。
给出以下datagrid(为简洁起见,删除了一些xaml):
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Width="auto">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我已成功将复选框绑定到每行的数据绑定对象。 (注意:我使用的是DataGridTemplateColumn
而不是DataGridCheckBoxColumn
,因此您无需双击即可更改值。)
我想要实现的是能够在用户选择行时勾选复选框/更新数据绑定对象的Selected属性。有效地使整行行单击设置复选框的checked属性。理想情况下,如果可能的话,我想在没有代码隐藏文件的情况下执行此操作,因为我试图尽可能保持代码的清晰。
如果可能的话,我想要的另一个功能是点击一行会切换它的选定属性,这样如果你点击另一个,前一个就会保持选中状态。
非常感谢任何帮助。
答案 0 :(得分:1)
为清楚起见。我明白了
如果可能的话,我想要的另一个特征就是那个 单击一行将切换它的选定属性,以便您可以 点击另一个,前一个保持选中以及 新的。
顺便说一下,当你选择下一个DataGridRow而不是DataGridRow本身时,你想要一个项目的CheckBox,分别是项目ViewModel上的Selected
属性保持选中状态?这是对的吗?
我的建议是使用* WPF行为 * s This is a good introduction扩展DataGrid
的行为。这样可以保持代码隐藏,但不要必须扭曲XAML才能让它做你想做的事。
这基本上就是行为的概念:编写可测试的代码,它没有与您的具体视图相结合,但仍允许您在“真实”代码中编写复杂的内容,而不是在XAML中编写。在我看来,你的案例是行为的典型任务。
您的行为可能看起来很简单。
public class CustomSelectionBehavior : Behavior<DataGrid>
{
protected override void OnAttached()
{
// Set mode to single to be able to handle the cklicked item alone
AssociatedObject.SelectionMode = DataGridSelectionMode.Single;
AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
}
protected override void OnDetaching()
{
AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
}
private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs args)
{
// Get DataContext of selected row
var item = args.AddedItems.OfType<ItemViewModel>();
// Toggle Selected property
item.Selected = !item.Selected;
}
}
将行为附加到特定的DataGrid,在XAML中完成:
<DataGrid ...>
<i:Interaction.Behaviors>
<b:CustomSelectionBehavior />
</i:Interaction.Behaviors>
...
</DataGrid>
您需要参考
System.Windows.Interactivity.dll
也包含Behavior<T>
基类。