子属性更改时更新内容绑定

时间:2010-08-13 14:07:25

标签: c# wpf binding

我有这样的标签:

<Label Name="LblUsersWithHair">
    <Binding Path="Users" 
             ElementName="ElementSelf" 
             Converter="{StaticResource Converter_UsersWithHairPresenter}" />
</Label>

转换器:

...

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    var users = value as ObservableCollection<Users>;
    if (users == null) return null;

    var usersWithHair = users.Count(user => user.HasHair == true);
    return "There are " + usersWithHair + " there has hair.";
}

...

现在的问题是,当'HasHair'属性发生变化时,标签当然不会更新,因为集合没有改变。但是,当设置此属性时,如何强制标签重新绑定?

上面的例子非常简单,但希望你能帮助我......:o)

3 个答案:

答案 0 :(得分:2)

您需要在INotifyPropertyChanged类中为Users属性实施HasHair

查看此帖子How to force ListBox to reload properties of ListBoxItems

答案 1 :(得分:1)

如果列表触发ListChanged事件,您的Binding将仅更新。这通常只发生在列表中的结构更改(添加/删除/替换)上,而不是单个列表项更改 - 即使它确实实现了INotifyPropertyChanged。 为项目实施INotifyPropertyChanged后,您仍需要执行以下两个选项之一:

  • 使用修改后的ObservableCollection,它监听任何项目的PropertyChanged-Event(在add / remove上注册)并在任何Change上触发ListChanged。
  • 创建一个CollectionViewSource,其中包含一个过滤谓词,用于评估HasHair,然后将您的标签绑定到此CollectionViewSource的项目计数而不是原始列表。

答案 2 :(得分:0)

麦克很可能成为目标。由于这个原因,框架需要某种方式来知道属性何时发生变化并且存在INPC(INotifyPropertyChanged)。我说可能是正确的,因为在这种情况下你使用的是一个带有INPC的ObservableCollection,并且我猜你是根据用户检查绑定到HasHair的内容从列表中添加/减去。如果您仍然遇到问题,请发布您的代码以及您认为应该发生的事情。

在你的时候,你可以将标签声明简化为:

<Label Content="{Binding Users, Converter={StaticResource Converter_UsersWithHairPresenter}"/>

您还可以在转换器中放置一个调试断点,首先查看它是否被调用,并检查输出窗口以查看是否报告了任何数据绑定错误。

HTH,
Berryl