[英]WPF: Get a ListBoxItem as CheckBox with a Template Style to synchronize with IsSelected
我正在制作MVVM WPF應用程序,在此應用程序中,我有一個帶有我自己的特權項的ListBox。
很久以后,我終於找到了一種解決方案 ,該方法如何使選擇與我的ViewModel同步。 (您還需要在您的項目類中實現IEquatable)
問題
現在,我想將ListBoxItems設置為CheckBoxes的樣式,有很多解決此問題的方法,但是沒有一個真正適合我的需求。
所以我想出了這個解決方案,因為我可以僅將這種樣式應用於所需的ListBox,而不必擔心DisplayMemberPath或Items樣式為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>
ViewModel:
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}"
它工作正常,但僅在一個方向上有效。 當在代碼中將一個項目添加到我的SelectedPrivileges
中時,它將顯示為選中狀態,但是當我在GUI中選中該項目時,它將不會執行任何操作。 (沒有CheckBox樣式,它就起作用了,這是因為TemplateBinding僅在一個方向上起作用)
我該如何工作? 我雖然有一些類似扳機的東西,但是我不知道如何實現這一點。
我相信您要找的東西實際上非常簡單。 您需要更改IsChecked
屬性的綁定的綁定模式,如下所示:
{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}
那應該做。
在這個出色的備忘單上可以找到這個以及基本上所有其他WPF綁定技巧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.