C# 带转换器的WPF绑定ObservableCollection

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(

我有一个可观察的字符串集合,我试图用converter to ListBox将其绑定,并仅显示以某个前缀开头的字符串。
我写道:

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用过滤器例子更新,应该可以,但我是从“内存”写的,可能有一些错误。谢谢!但是过滤器似乎没有更新列表中的现有值