Связывание 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