如何在选择DataGridRow时对数据执行自定义操作?

时间:2013-03-12 09:15:38

标签: wpf data-binding datagrid

我一直在试图弄清楚如何将这种自定义行为转换为数据网格,而在网上搜索解决方案时看起来并不多。

给出以下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属性。理想情况下,如果可能的话,我想在没有代码隐藏文件的情况下执行此操作,因为我试图尽可能保持代码的清晰。

如果可能的话,我想要的另一个功能是点击一行会切换它的选定属性,这样如果你点击另一个,前一个就会保持选中状态。

非常感谢任何帮助。

1 个答案:

答案 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>基类。