Изменить привязку данных в WPF ComboBox при изменении значения флажка - PullRequest
2 голосов
/ 05 марта 2009

У меня есть WPF ComboBox, который связан с коллекцией, но в зависимости от того, установлен флажок или нет, я бы хотел изменить, к какой коллекции привязан ComboBox.

Основная проблема заключается в том, что у меня есть большая коллекция MyCustomer, а также у меня есть отфильтрованная коллекция MyCustomer - фильтрация довольно интенсивная, и я не хочу делать это с CollectionView, потому что это уже сделано. отфильтрованная коллекция уже существует - следовательно, необходимо просто переключить привязку данных комбо.

Я надеюсь на чистое решение XAML, очевидно, что написание некоторого кода было бы относительно простым решением, но не кажется, что это необходимо.

Ответы [ 2 ]

5 голосов
/ 06 марта 2009

Вот пример использования 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 с фильтрами или чем-то еще, но принцип тот же.

2 голосов
/ 05 марта 2009

Лучший способ, который я знаю, - это использовать некоторую коллекцию оболочек, которая внутренне «получает» нужную коллекцию.

Итак, у вас есть UnfilteredCollection и FilteredCollection, а затем свойство BindingCollection, которое в своем «получателе» оценивает некоторое состояние (флажок будет привязан к этому состоянию), чтобы определить, какую коллекцию следует извлечь.

Если вы используете MVVM для привязки данных между пользовательским интерфейсом и коллекциями, один из способов сделать это будет следующим:

<!-- 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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...