【问题标题】:wpf IValueConverter not updating the viewwpf IValueConverter 不更新视图
【发布时间】:2012-06-14 00:55:17
【问题描述】:

我正在尝试使用 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>

【问题讨论】:

    标签: wpf binding ivalueconverter


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      它没有更新,因为您的 A 属性没有实现 INotifyPropertyChanged 或者是 DependencyProperty

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

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

      【讨论】:

      • 更改了代码以实现代理对象的 INotifyPropertyChanged 并更改了 xaml。还是没有运气..
      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 2014-10-20
      • 2020-06-11
      • 2011-08-25
      • 1970-01-01
      • 2012-07-07
      相关资源
      最近更新 更多