WPF绑定不使用路径和转换器,更新

4
我有一个使用转换器的无路径绑定。这是因为转换器将使用对象的多个属性来构建工具提示文本。但是,当某个属性更改(已实现INotifyPropertyChanged并引发OnPropertyChanged时),此无路径绑定不会被更新。我猜测这是因为它没有绑定到特定属性。

如何告诉它更新呢?


我试图更具体一些:

bar对象有一个'Start'属性。当我更改它时,由于绑定直接到达Start属性,所以bar在时间上移动。所以单个属性的通知可以正常工作。但是工具提示绑定是{Binding Converter={StaticResource TooltipConverter}},并没有绑定到特定属性。当'Start'更改时,bar会移动,但工具提示不会更新,因为tooltipconverter不会被再次调用。

bar是ObservableCollection<Bar>中的一个对象。应该让bar告诉集合还是视图模型?通常情况下,这与它没有任何关系。


使用 string.empty 触发 PropertyChangedEvent - Jehof
@Jehof 那个不起作用。 - ZoolWay
3个回答

7

一种可能的解决方法是:

给你的对象添加一个名为ItSelf(或其他名称)的属性,例如:

public Object ItSelf
{
    get { return this; }
}

不是绑定

{Binding Converter={StaticResource TooltipConverter}}

使用

{Binding ItSelf, Converter={StaticResource TooltipConverter}}

然后你为每个属性的''ItSelf''提高OnPropertyChanged。这样,当对象在绑定中使用时,你可以向整个对象发出更新信号。

public DateTime Start
{
    get { return this.start; }
    set { this.start = value; OnPropertyChanged("Start"); OnPropertyChanged("ItSelf");
}

我让它运行得更快了,但是我想尝试使用AttachedBehavior像@AnatoliiG所说的那样,所以我稍后会接受一个答案。

0
如果在数据类型类上实现了INotifyPropertyChange接口,那么它会负责通知类属性的更改。如果在视图模型类上实现了INotifyPropertyChange接口,并且该类具有您的类类型的属性,则它会负责通知该属性的更改,这种情况下是整个对象。

更新 >>>

好的...我相信你有一个类型为ObservableCollection<Bar>的属性。如果你为每个项目添加一个PropertyChanged处理程序...:

foreach (Bar item in YourCollectionProperty) item.PropertyChanged += 
Item_PropertyChanged;

如果你想这样做:

private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    NotifyPropertyChanged("YourCollectionProperty");
}

我添加了一些详细信息。当属性更改时,对象是否应该通知视图模型?通常它不知道视图模型的存在。 - ZoolWay
这是否意味着他期望整个集合都已更改,然后重新绘制所有条形图,而不仅仅是特定已更改的那一个? - ZoolWay
这个不起作用。NotifyPropertyChanged没有重新绘制该条。我猜他检查并发现集合与之前相同。但是当在Item_PropertyChanged中执行collection.Remove(sender)collection.Add(sender)时,它会更新 - 因为该条被删除并重新添加。不确定是否是最佳解决方案。仍在测试其他方法。 - ZoolWay

0
为了明确一点: 您有一些用于集合中项目的DataTemplate。 项目类型是Bar。 父列表的ItemsSource是Bar对象的集合。 如果特定的Bar对象中的任何属性更改,则要更改工具提示。
问题在于,当您不指定特定路径绑定时,将订阅DataContext的更改通知,而在您的情况下,DataContext是Bar。 因此,它不关心对象内部的更改或通知。 您可以实现冒泡,以便更改事件将路由到父对象,但我更喜欢为此类事情定义单独的Changed属性。
public bool StateChanged
{
   get { return true; }
}

并在您的类中订阅 PropertyChanged 事件:

this.PropertyChanged += PropertyChangedHandler;

在处理程序中通知您的对象状态已更改:
private void PropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
    if  (!e.PropertyName.Equals("StateChanged"))
    {
        this.OnPropertyChanged("StateChanged");
    }
}

但是绑定没有绑定到StateChanged,因此当执行OnPropertyChanged("StateChanged")时不会更新... - ZoolWay
1
@ZoolWay 是的。您应该绑定到 StateChanged,并将 ConverterParameter 作为 DataContext 传递。就这么简单。 - Anatolii Gabuza
我该如何将当前的DataContext对象作为转换器参数传递?ConverterParameter是object类型,不能使用绑定。 - ZoolWay
@ZoolWay 是的,我忘记了。所以创建 AttachedBehavior 而不是转换器。非常简单的事情。 - Anatolii Gabuza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接