4

私は MVVM WPF アプリケーションを作成しています。このアプリケーションには、独自の特権項目を持つ ListBox があります。

長い年月を経て、選択範囲を ViewModel と同期させる方法をついに見つけました(アイテム クラスに IEquatable を実装する必要もあります)

問題

ListBoxItems を CheckBoxes としてスタイルしたいのですが、この問題には多くの解決策がありますが、私のニーズに本当に合うものはありません。

このスタイルを必要な ListBoxes にのみ適用でき、DisplayMemberPath やアイテムが CheckBoxおよびListBoxItemsとしてスタイル設定されていることを心配する必要がないため、このソリューションを思いつきました。

意見:

<ListBox Grid.Row="5" Grid.Column="1"
         ItemsSource="{Binding Privileges}"
         BehavExt:SelectedItems.Items="{Binding SelectedPrivileges}"
         SelectionMode="Multiple"
         DisplayMemberPath="Name"
         Style="{StaticResource CheckBoxListBox}"/>

スタイル:

<Style x:Key="CheckBoxListBox"
       TargetType="{x:Type ListBox}"
       BasedOn="{StaticResource MetroListBox}">

    <Setter Property="Margin" Value="5" />
    <Setter Property="ItemContainerStyle"
            Value="{DynamicResource CheckBoxListBoxItem}" />
</Style>

<Style x:Key="CheckBoxListBoxItem"
       TargetType="{x:Type ListBoxItem}"
       BasedOn="{StaticResource MetroListBoxItem}">

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <CheckBox IsChecked="{TemplateBinding Property=IsSelected}">
                    <ContentPresenter />
                </CheckBox>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ビューモデル:

private ObservableCollection<Privilege> _privileges;
public ObservableCollection<Privilege> Privileges
{
    get { return _privileges; }
    set {
        _privileges = value;
        RaisePropertyChanged(() => Privileges);
    }
}

private ObservableCollection<Privilege> _selectedPrivileges;
public ObservableCollection<Privilege> SelectedPrivileges
{
    get { return _selectedPrivileges; }
    set
    {
        _selectedPrivileges = value;
        RaisePropertyChanged(() => SelectedPrivileges);
    }
}

問題は次の行です。

IsChecked="{TemplateBinding Property=IsSelected}"

正常に動作しますが、一方向のみです。コードでmy にアイテムを追加すると、SelectedPrivilegesチェック済みとして表示されますが、GUI でこのアイテムをチェックしても何もしません。(CheckBox スタイルがなくても機能するのは、TemplateBinding が一方向にしか機能しないためです)

これを機能させるにはどうすればよいですか?トリガーのようなものについて考えましたが、これを達成する方法がわかりません。

4

1 に答える 1

2

あなたが探しているものは、実際にはかなり簡単だと思います。IsChecked次のように、プロパティのバインディングのバインディング モードを変更する必要があります。

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}

それはそれを行う必要があります。

これと基本的に他の WPF バインディングのヒントは、この優れたチート シートで見つけることができます。

于 2013-02-26T14:50:18.147 に答える