Связывание WPF с Комбо, используя только подмножество элементов Коллекции

Я пытаюсь установить привязку TwoWay к комбинированному списку, используя только выбор объектов коллекции. В настоящее время все работает хорошо, если я просто хочу связать все в коллекции, но в приведенном ниже примере класса, что если я хочу показать только элементы, где Active=True? Я могу фильтровать элементы, используя LINQ, например ItemsSource = FROM x IN Coll WHERE x.Active=True, но затем я теряю привязку TwoWay. Т.е., если имя или активное состояние в источнике обновляется из другого места, поле со списком не обновляется автоматически.

Возможно ли это сделать? Если нет, есть ли у кого-нибудь, кто имел дело с этим, какие-то предложения?

'The Class
Public Class Test
    Implements ComponentModel.INotifyPropertyChanged

    Private _Name As String
    Private _Active As Boolean

    Public Sub New(Name As String, Active As Boolean)
        _Name=Name
        _Active=Active
    End Sub

    Public Property Name() As String
End Class



'Declare a Collection and add some Tests, then bind to Cbo in Page Load
Dim Coll As New ObservableCollection
Coll.Add(New Test("Test1", True))
Coll.Add(New Test("Test2", False))
Coll.Add(New Test("Test3", True))
TheComboBox.ItemsSource=Coll

2 ответа

Решение

Два варианта:

Вы можете использовать фреймворк, такой как Bindable LINQ, который заставляет ваши запросы LINQ возвращать наблюдаемые коллекции (таким образом, привязка остается двусторонней).

Или вы можете привязать элементы вашего ComboBox к CollectionViewSource и запускать каждый элемент через обработчик событий Filter:

<CollectionViewSource
    Source="{Binding MyItems}"
    Filter="OnlyActiveItems"
    x:Key="ItemsView"/>

<ComboBox ItemsSource="{Binding Source={StaticResource ItemsView}}" />

с выделенным кодом:

private void OnlyActiveItems(object sender, FilterEventArgs e)
{
    e.Accepted = false;

    var item = e.Item as Text;
    if (item == null) return;

    e.Accepted = item.Active;
}

Обратите внимание, что я не совсем уверен, что CollectionViewSource распознает интерфейс INotifyPropertyChanged и повторно запросит список при изменении одного элемента. Я бы действительно предложил Bindable LINQ, если подход фильтра не работает.

Класс CollectionViewSource может добавлять сортировку и фильтрацию к любому элементу управления WPF

Другие вопросы по тегам