gpt4 book ai didi

c# - WPF 绑定(bind) ObservableCollection 与转换器

转载 作者:行者123 更新时间:2023-12-02 22:04:17 26 4
gpt4 key购买 nike

我有一个 ObservableCollection 字符串,我试图将它与转换器绑定(bind)到 ListBox 并仅显示以某个前缀开头的字符串。
我写道:

public ObservableCollection<string> Names { get; set; }

public MainWindow()
{
InitializeComponent();
Names= new ObservableCollection<Names>();
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;
}
}

和 XAML:

<ListBox x:Name="filesList" ItemsSource="{Binding Path=Names, Converter={StaticResource NamesListConverter}}" />

但列表框在更新(添加或删除)后不会更新。
我注意到,如果我从绑定(bind)中删除转换器,它会完美地工作。我的代码有什么问题?

最佳答案

您的转换器正在从原始 ObservableCollection 中的对象创建新集合。使用您的绑定(bind)设置的 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;
}

转换器返回的列表是带有源集合数据副本的新对象。原始集合中的进一步更改未反射(reflect)在该新列表中,因此 ListBox 不知道该更改。如果您想过滤数据,请查看 CollectionViewSource .

编辑:如何过滤

     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;
}

在 XAML 中将 ItemsSource 设置为 CollectionView

<ListBox x:Name="filesList" ItemsSource="{Binding Path=View}"/>

关于c# - WPF 绑定(bind) ObservableCollection 与转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16372822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com