Связывание WPF с Комбо, используя только подмножество элементов Коллекции - PullRequest
3 голосов
/ 18 мая 2009

Я пытаюсь установить привязку 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 ]

3 голосов
/ 18 мая 2009

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

Вы можете использовать такую ​​структуру, как 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, если подход фильтра не работает.

0 голосов
/ 18 мая 2009

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

...