我有一个名为ChosenListView的ListView在我的UserControl。在我的UserControl的构造函数中,我将DataContext设置为ViewModel,它包括一个ObservableCollection(称为Elements),其中包含具有bool IsChosen属性的元素。
我想让ChosenListView显示Elements中IsChosen属性为true的所有元素。我希望它能自动更新每次我改变其中一个元素IsChosen属性。
我试图利用INotifyPropertyChanged,但我似乎不能让它工作,并希望得到任何帮助。
我在这里定义一个CollectionViewSource:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<CollectionViewSource
x:Key="ChosenElementsViewSource"
x:Name="ChosenElementsViewSource"
Source="{Binding Elements}"
Filter="ChosenElementsViewSource_Filter"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
这是过滤器:
private void ChosenElementsViewSource_Filter(object sender, FilterEventArgs e)
{
e.Accepted = e.Item is ChoosableElement choosableElement &&
choosableElement.IsChosen;
}
这是我的ViewModel:
private class ViewModel
{
public ObservableCollection<ChoosableElement> Elements { get; set; }
}
在我的UserControl的构造函数中,我将DataContext设置为ViewModel的一个新示例,并基于我的数据库初始化Elements,其中所有元素都以IsChosen=false开头。
My ListView在XAML中定义了一个ItemsSource:
ItemsSource="{Binding Source={StaticResource ChosenElementsViewSource}}"
最后,我的ChoosableElement定义如下:
private class ChoosableElement : INotifyPropertyChanged
{
public Element Element { get; set; }
private bool isChosen = false;
public bool IsChosen
{
get { return isChosen; }
set
{
if (isChosen != value)
{
isChosen = value;
OnPropertyChanged(nameof(IsChosen));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
1条答案
按热度按时间5vf7fwbs1#
每次设置
IsChosen
属性时,都需要刷新CollectionViewSource
以调用Filter
事件处理程序。您也可以通过处理
UserControl
的代码隐藏中所有项的PropertyChanged
事件,以编程方式自己完成此操作。大概是这样的:或者,您可以在XAML标记中的
CollectionViewSource
上直接启用.NET Framework 4.5中引入的实时筛选功能: