簡體   English   中英

WPF:獲取具有模板樣式的ListBoxItem作為CheckBox並與IsSelected同步

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM