gpt4 book ai didi

wpf IValueConverter 不更新 View

转载 作者:行者123 更新时间:2023-12-04 05:43:32 26 4
gpt4 key购买 nike

我正在尝试使用 IValueConverter 将集合转换为代理对象以进行数据绑定(bind)。

转换器似乎工作正常,但问题是在集合中添加或删除新对象时。 View 中没有刷新相同的..

模型对象:

public class A {
public ObservableCollection<string> Members { get; }
}

转换器
public class MemberConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
var collection = new CompositeCollection();
var a = value as A;

a.Members.ToList().ForEach(member => {
collection.Add(new ProxyClass{ A= a, Member= member });
});

return collection;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new System.NotImplementedException();
}
}

代理类
public class ProxyClass {
public A A { get; set; }

public string Member{ get; set; }
}

XAML:
<DataTemplate DataType="{x:Type my:ProxyClass}">
<TextBlock Text="{Binding Path=Member}"/>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type A}" ItemsSource="{Binding Converter={StaticResource MemberConverter}}">
<TextBlock Text ="{Binding}"/>
</HierarchicalDataTemplate>

最佳答案

仅当绑定(bind)到的属性的属性更改通知已更改时,才会重新评估绑定(bind)。在这种情况下,ItemsSource 绑定(bind)到 DataContext - A 实例本身 - 所以除非给它一个新的 A 实例,否则它不会被重新评估。没有监听集合引发的更改通知,因为赋予 ItemsSource 的值实际上是您在转换器中创建的不同集合实例。

一种选择是让转换器创建一个辅助类来 Hook 源集合的 CollectionChanged 事件(即传递给转换器的值),并且该对象将负责保持源集合与其创建的集合保持同步。另一种选择是尝试强制绑定(bind)重新评估 - 例如对 ItemsSource 绑定(bind)使用“成员”路径,并且当您更改集合的内容时,会在 A 上为“成员”引发属性更改通知。

关于wpf IValueConverter 不更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974688/

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