C# 带转换器的WPF绑定ObservableCollection
我有一个可观察的字符串集合,我试图用converter to ListBox将其绑定,并仅显示以某个前缀开头的字符串。C# 带转换器的WPF绑定ObservableCollection,c#,wpf,data-binding,observablecollection,C#,Wpf,Data Binding,Observablecollection,我有一个可观察的字符串集合,我试图用converter to ListBox将其绑定,并仅显示以某个前缀开头的字符串。 我写道: publicobservableCollection名称{get;set;} 公共主窗口() { 初始化组件(); 名称=新的ObservableCollection(); DataContext=this; } 和转换器: class NamesListConverter : IValueConverter { public object Convert(
我写道:
publicobservableCollection名称{get;set;}
公共主窗口()
{
初始化组件();
名称=新的ObservableCollection();
DataContext=this;
}
和转换器:
class NamesListConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
return (value as ICollection<string>).Where((x) => x.StartsWith("A"));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
类名称列表转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
如果(值==null)
返回null;
返回(作为ICollection的值)。其中((x)=>x.StartsWith(“A”);
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回null;
}
}
以及XAML:
<ListBox x:Name="filesList" ItemsSource="{Binding Path=Names, Converter={StaticResource NamesListConverter}}" />
但是列表框在其beed更新(添加或删除)后不会更新。我注意到,如果我将转换器从绑定中移除,它将完美地工作。
我的代码有什么问题?转换器正在从原始ObservableCollection中的对象创建新集合。使用绑定设置的ItemsSource不再是原始ObservableCollection。 为了更好地理解,这与您所写的内容相同:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
var list = (value as ICollection<string>).Where((x) => x.StartsWith("A")).ToList();
return list;
}
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
如果(值==null)
返回null;
var list=(值为ICollection)。其中((x)=>x.StartsWith(“A”)).ToList();
退货清单;
}
转换器返回的列表是具有来自源集合的数据副本的新对象。原始集合中的进一步更改不会反映在新列表中,因此ListBox不知道这些更改。
如果您想筛选数据,请查看
编辑:如何筛选
public ObservableCollection<string> Names { get; set; }
public ICollectionView View { get; set; }
public MainWindow()
{
InitializeComponent();
Names= new ObservableCollection<string>();
var viewSource = new CollectionViewSource();
viewSource.Source=Names;
//Get the ICollectionView and set Filter
View = viewSource.View;
//Filter predicat, only items that start with "A"
View.Filter = o => o.ToString().StartsWith("A");
DataContext=this;
}
publicobservableCollection名称{get;set;}
公共ICollectionView视图{get;set;}
公共主窗口()
{
初始化组件();
名称=新的ObservableCollection();
var viewSource=new CollectionViewSource();
viewSource.Source=名称;
//获取ICollectionView并设置过滤器
View=viewSource.View;
//筛选器谓词,仅以“A”开头的项
View.Filter=o=>o.ToString().StartsWith(“A”);
DataContext=this;
}
在XAML中,将ItemsSource设置为CollectionView
<ListBox x:Name="filesList" ItemsSource="{Binding Path=View}"/>
转换器正在从原始ObservableCollection中的对象创建新集合。使用绑定设置的ItemsSource不再是原始ObservableCollection。 为了更好地理解,这与您所写的内容相同:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null;
var list = (value as ICollection<string>).Where((x) => x.StartsWith("A")).ToList();
return list;
}
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
如果(值==null)
返回null;
var list=(值为ICollection)。其中((x)=>x.StartsWith(“A”)).ToList();
退货清单;
}
转换器返回的列表是具有来自源集合的数据副本的新对象。原始集合中的进一步更改不会反映在新列表中,因此ListBox不知道这些更改。
如果您想筛选数据,请查看
编辑:如何筛选
public ObservableCollection<string> Names { get; set; }
public ICollectionView View { get; set; }
public MainWindow()
{
InitializeComponent();
Names= new ObservableCollection<string>();
var viewSource = new CollectionViewSource();
viewSource.Source=Names;
//Get the ICollectionView and set Filter
View = viewSource.View;
//Filter predicat, only items that start with "A"
View.Filter = o => o.ToString().StartsWith("A");
DataContext=this;
}
publicobservableCollection名称{get;set;}
公共ICollectionView视图{get;set;}
公共主窗口()
{
初始化组件();
名称=新的ObservableCollection();
var viewSource=new CollectionViewSource();
viewSource.Source=名称;
//获取ICollectionView并设置过滤器
View=viewSource.View;
//筛选器谓词,仅以“A”开头的项
View.Filter=o=>o.ToString().StartsWith(“A”);
DataContext=this;
}
在XAML中,将ItemsSource设置为CollectionView
<ListBox x:Name="filesList" ItemsSource="{Binding Path=View}"/>
添加或删除元素时可能未使用转换器。实现所需功能的最简单方法可能是在类中实现INotifyPropertyChanged,并在每次添加或删除项时触发PropertyChanged事件。
通常,“正确”的方法是使用
CollectionView
在添加或删除元素时,可能不使用转换器。实现所需功能的最简单方法可能是在类中实现INotifyPropertyChanged,并在每次添加或删除项时触发PropertyChanged事件。
通常,“正确”的方法是使用
CollectionView
您不能使用DynamicSource-to-converter。异常Thrown无法使用DynamicSource到转换器。谢谢!你可以为我需要的东西写一个例子吗?@user2348001用过滤器例子更新,应该可以,但我是从“内存”写的,可能有一些错误。谢谢!但是过滤器似乎没有更新列表中的现有值。谢谢!你可以为我需要的东西写一个例子吗?@user2348001用过滤器例子更新,应该可以,但我是从“内存”写的,可能有一些错误。谢谢!但是过滤器似乎没有更新列表中的现有值