3

我一直在试图弄清楚如何在在线搜索解决方案时将这种自定义行为放入数据网格中而无需多看。

给定以下数据网格(为简洁起见,删除了一些 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 属性。有效地使整行单击设置复选框的选中属性。理想情况下,如果可能的话,我想在没有代码隐藏文件的情况下执行此操作,因为我试图让我的代码尽可能干净。

如果可能的话,我想要的另一个功能是单击一行将切换它的选定属性,这样如果您单击另一个,前一个和新的一样保持选中状态。

任何帮助深表感谢。

4

1 回答 1

1

为了清楚起见。我明白了

如果可能的话,我想要的另一个功能是单击一行将切换它的选定属性,这样如果您单击另一个,前一个和新的一样保持选中状态。

in the way, that you want the CheckBox of the an item, respectively the Selectedproperty on the items ViewModel, to stay selected, when the next DataGridRow is selected, but not the DataGridRow itself? 那是对的吗?

我的建议是扩展您DataGridusing * WPF 行为*s 的行为(这是一个很好的介绍。这样您可以保持代码隐藏清晰,但不必扭曲 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>基类。

于 2013-03-12T10:09:55.923 回答