4

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

如何判断它必须更新?


我尝试更具体:

条形对象具有“开始”属性。当我更改它时,条会及时移动,因为绑定直接到 Start 属性。所以通知适用于单个属性。但是工具提示绑定是{Binding Converter={StaticResource TooltipConverter}}并且不绑定到特定属性。当“开始”更改时,栏会移动,但工具提示不会更新,因为不会再次调用工具提示转换器。

条形图是 中的一个对象ObservableCollection<Bar>。栏应该告诉集合还是视图模型?通常是不会与它有任何关系。

4

3 回答 3

7

一种可能的解决方法是:

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

public Object ItSelf
{
    get { return this; }
}

而不是绑定

{Binding Converter={StaticResource TooltipConverter}}

利用

{Binding ItSelf, Converter={StaticResource TooltipConverter}}

然后你OnPropertyChanged为每个属性筹集“ItSelf”。因此,只要在绑定中使用它,您就可以发出整个对象的更新信号。

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

我让它工作得更快一点,但AttachedBehavior想像@AnatoliiG 所说的那样测试一下,所以我稍后会接受答案。

于 2013-11-13T13:50:00.820 回答
0

只是为了说清楚:你有一些DataTemplatefor item 在一个集合中。项目类型是BarItemsSource对于父列表是Bar对象的集合。Bar如果特定对象中的任何属性发生更改,您想要更改工具提示。

问题是,当您未指定特定路径时,绑定将订阅更改通知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");
    }
}
于 2013-11-13T11:31:13.913 回答
0

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


更新>>>

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

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

...那么你可以这样做:

private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    NotifyPropertyChanged("YourCollectionProperty");
}
于 2013-11-13T10:28:59.313 回答