选择项目时禁用组合框关闭

时间:2017-06-26 08:40:07

标签: c# wpf xaml

我有自定义ComboBox的{​​{1}}。 ComboBoxItem包含ComboBoxItemTextBlockCheckBox绑定到我的ViewModel中的bool属性。当我点击CheckBox时,一切正常,但当我点击CheckBox - TextBlock关闭时!我需要' MultiSelection'我的ComboBox

中的模式

XAML:

ComboBox

VM:

<ComboBox ItemsSource="{Binding Elements}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <TextBlock Text="{Binding Caption}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox> 

2 个答案:

答案 0 :(得分:1)

如果不进行大量调整,你就无法在封闭的组合框中真正显示多项选择,所以我猜这部分并不是真的需要。所以我建议你使用一个按钮和一个弹出窗口,其中弹出窗口包含一个列表视图,为你的项目启用了多项选择。

作为Button,我使用Extended WPF Toolkit中的DropDownButton,你也可以用不同的方式实现它。

介绍Extended WPF Toolkit命名空间:

xmlns:xt="http://schemas.xceed.com/wpf/xaml/toolkit"

实际的事情:

<xt:DropDownButton Content="Elements Selection" VerticalAlignment="Top" HorizontalAlignment="Left" MinWidth="100">
    <xt:DropDownButton.DropDownContent>
        <ListView ItemsSource="{Binding Elements}" SelectionMode="Multiple" MinWidth="100">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType=ListViewItem}}">
                        <CheckBox.Content>
                            <TextBlock Text="{Binding Caption}"/>
                        </CheckBox.Content>
                    </CheckBox>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </xt:DropDownButton.DropDownContent>
</xt:DropDownButton>

反映WPF中属性更改的另一个重要细节:您的属性更改通知需要来源而不是null

protected void RaisePropertyChanged(string _property)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler.Invoke(this, new PropertyChangedEventArgs(_property));
    }
}

答案 1 :(得分:0)

Content的{​​{1}}属性绑定到您的CheckBox媒体资源,并使用展开Caption容器的ItemContainerStyle

ComboBoxItem