当Checkbox值更改时,更改WPF ComboBox中的数据绑定

时间:2009-03-04 23:07:35

标签: wpf data-binding

我有一个WPF ComboBox,它可以数据绑定到Collection,但是根据是否检查Checkbox,我想改变ComboBox绑定的Collection。

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

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

2 个答案:

答案 0 :(得分:5)

以下是使用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>

对于你来说,这些不是不同的数组,但可能是带有过滤器的不同CollectionViewSources,但原理是相同的。

答案 1 :(得分:2)

我知道最好的方法是使用一些内部'获得'正确集合的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的实现细节,但如果你愿意,我可以):

private ObservableCollection<MyCustomer> UnfilteredCollection
{
    get { return _unfilteredCollection; }
}

private ObservableCollection<MyCustomer> FilteredCollection
{
    get { return _filteredCollection; }
}

// The public collection to which your ComboBox is bound
public ObservableCollection<MyCustomer> BindingCollection
{
    get 
    { 
        return UseFilteredSet ? 
            FilteredCollection : 
            UnfilteredCollection; 
    }
}

// CheckBox is bound to this state value, which tells the bindings on the shell 
// collection to refresh when the value of this state changes.
public bool UseFilteredSet
{
    get { return _useFilteredSet; }
    set 
    { 
        _useFilteredSet = value;
        OnPropertyChanged("UseFilteredSet");
        OnPropertyChanged("BindingCollection");
    }
}