私は 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 が一方向にしか機能しないためです)
これを機能させるにはどうすればよいですか?トリガーのようなものについて考えましたが、これを達成する方法がわかりません。