wpf IValueConverter不更新视图

时间:2012-06-11 05:03:33

标签: wpf binding ivalueconverter

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

转换器似乎工作正常,但问题是在集合中添加或删除新对象时。在视图中不会刷新相同的内容..

模型对象:

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>

2 个答案:

答案 0 :(得分:2)

只有在绑定了绑定属性的属性更改通知发生更改时,才会重新评估绑定。在这种情况下,ItemsSource绑定到DataContext - A实例本身 - 所以除非给它一个新的A实例,否则它不会被重新评估。由于赋予ItemsSource的值实际上是您在转换器中创建的不同集合实例,因此没有任何内容可以监听集合引发的更改通知。

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

答案 1 :(得分:0)

由于您的A媒体资源未实施INotifyPropertyChangedDependencyProperty

,因此未进行更新

如果需要,可以在实现之前的一个之后添加以下内容。

ItemsSource="{Binding Converter={StaticResource MemberConverter}, UpdateSourceTrigger=PropertyChanged}">