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

明確にするために。わかった

可能であれば、行をクリックすると選択されたプロパティが切り替わり、別の行をクリックすると、前の行も新しい行も選択されたままになるという別の機能が必要です。

次の DataGridRow が選択されたときに、アイテムの CheckBox、それぞれのSelectedアイテム ViewModel のプロパティを選択したままにしておきますが、DataGridRow 自体は選択しないでください。あれは正しいですか?

私の提案は、 * WPF の動作*sDataGridを使用して動作を拡張することです (これは良い導入です。この方法では、コード ビハインドを明確に保つことができますが、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 に答える