当复选框值更改时,更改WPF组合框上的数据绑定

当复选框值更改时,更改WPF组合框上的数据绑定,wpf,data-binding,Wpf,Data Binding,我有一个WPF组合框,它被数据绑定到一个集合,但是根据复选框是否被选中,我想改变组合框绑定到哪个集合 基本问题是我有一个MyCustomer的大集合,我也有一个MyCustomer的过滤集合-过滤非常密集,我不想使用CollectionView进行过滤,主要原因是它已经完成,过滤集合已经存在-因此需要简单地切换组合的数据绑定 我希望有一个纯粹的XAML解决方案,显然编写一些代码是一个相对简单的解决方案,但我觉得这不是必需的。我知道的最好的方法是使用一些shell集合,在内部“获取”正确的集合 因

我有一个WPF组合框,它被数据绑定到一个集合,但是根据复选框是否被选中,我想改变组合框绑定到哪个集合

基本问题是我有一个MyCustomer的大集合,我也有一个MyCustomer的过滤集合-过滤非常密集,我不想使用CollectionView进行过滤,主要原因是它已经完成,过滤集合已经存在-因此需要简单地切换组合的数据绑定


我希望有一个纯粹的XAML解决方案,显然编写一些代码是一个相对简单的解决方案,但我觉得这不是必需的。

我知道的最好的方法是使用一些shell集合,在内部“获取”正确的集合

因此,您有UnfilteredCollection和FilteredCollection,然后有一个名为BindingCollection的属性,该属性在其“getter”中计算某些状态(复选框将绑定到此状态),以确定要检索的集合

如果使用MVVM在UI和集合之间进行数据绑定,一种方法如下:

<!-- Your ComboBox binds to some shell collection -->
<ComboBox ItemsSource="{Binding BindingCollection}" />
<!-- The input to this item will determine which collection is internally exposed -->
<CheckBox IsChecked="{Binding UseFilteredSet}" />

然后让您的ViewModel(中间层)文件执行如下操作(我不包括INotifyPropertyChanged的实现细节,但如果您愿意,我可以):

私有ObservableCollection未筛选的集合
{
获取{return\u unfilteredCollection;}
}
私有可观察集合筛选器已安装集合
{
获取{return\u filteredCollection;}
}
//组合框绑定到的公共集合
公共可观察集合BindingCollection
{
得到
{ 
返回UseFilteredSet?
FilteredCollection:
未过滤收集;
}
}
//复选框绑定到此状态值,该状态值指示shell上的绑定
//此状态的值更改时要刷新的集合。
公共bool UseFilteredSet
{
获取{return\u useFilteredSet;}
设置
{ 
_useFilteredSet=值;
已更改的不动产(“UseFilteredSet”);
OnPropertyChanged(“BindingCollection”);
}
}

下面是一个使用DataTrigger切换集合的示例:

<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel.Resources>
        <x:Array x:Key="notes" Type="{x:Type sys:String}">
            <sys:String>do</sys:String>
            <sys:String>re</sys:String>
            <sys:String>mi</sys:String>
        </x:Array>
        <x:Array x:Key="letters" Type="{x:Type sys:Char}">
            <sys:Char>a</sys:Char>
            <sys:Char>b</sys:Char>
            <sys:Char>c</sys:Char>
        </x:Array>
    </StackPanel.Resources>

    <CheckBox x:Name="chkLetters" Content="Use Letters"/>
    <ListBox>
        <ListBox.Style>
            <Style TargetType="{x:Type ListBox}">
                <Setter Property="ItemsSource" Value="{StaticResource notes}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsChecked, ElementName=chkLetters}" Value="True">
                        <Setter Property="ItemsSource" Value="{StaticResource letters}"/>
                    </DataTrigger>
                 </Style.Triggers>
            </Style>
        </ListBox.Style>
    </ListBox>
</StackPanel>

做
重新
惯性矩
A.
B
C

对你来说,这些不会是不同的数组,但可能是不同的CollectionViewSources和过滤器之类的东西,但原理是一样的。

谢谢KP-我昨天有这个想法,但希望得到一个“更纯”的xaml解决方案-也许我找错了方向,一开始纯xaml解决方案并不是正确的方法。好的,我唯一想到的是一种基于触发器的方法根据复选框的IsChecked属性更改“ItemsSource”属性,但我不知道如何使其工作。
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel.Resources>
        <x:Array x:Key="notes" Type="{x:Type sys:String}">
            <sys:String>do</sys:String>
            <sys:String>re</sys:String>
            <sys:String>mi</sys:String>
        </x:Array>
        <x:Array x:Key="letters" Type="{x:Type sys:Char}">
            <sys:Char>a</sys:Char>
            <sys:Char>b</sys:Char>
            <sys:Char>c</sys:Char>
        </x:Array>
    </StackPanel.Resources>

    <CheckBox x:Name="chkLetters" Content="Use Letters"/>
    <ListBox>
        <ListBox.Style>
            <Style TargetType="{x:Type ListBox}">
                <Setter Property="ItemsSource" Value="{StaticResource notes}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsChecked, ElementName=chkLetters}" Value="True">
                        <Setter Property="ItemsSource" Value="{StaticResource letters}"/>
                    </DataTrigger>
                 </Style.Triggers>
            </Style>
        </ListBox.Style>
    </ListBox>
</StackPanel>