我有一个没有路径的绑定使用转换器。这是因为转换器将使用对象的许多属性来构建工具提示的文本。但是当一个属性更改(实现INotifyPropertyChanged并引发OnPropertyChanged)时,不带路径的此绑定不会更新。我猜是因为它没有绑定到特定的属性。
如何判断它必须更新?
我试着更具体:
条形对象具有“开始”属性。当我更改此栏时,栏会及时移动,因为绑定直接到达Start属性。因此,通知适用于单个属性。但是工具提示绑定是{Binding Converter={StaticResource TooltipConverter}}
并且不绑定到特定属性。当“开始”更改时,条形图会移动,但工具提示不会更新,因为不会再次调用tooltipconverter。
条形图是ObservableCollection<Bar>
中的一个对象。栏应该告诉收藏品还是视图模型?通常与它没有任何关系。
答案 0 :(得分:5)
一种可能的解决方法是:
为您的对象提供 ItSelf 属性(或其他名称),例如:
public Object ItSelf
{
get { return this; }
}
而不是绑定
{Binding Converter={StaticResource TooltipConverter}}
使用
{Binding ItSelf, Converter={StaticResource TooltipConverter}}
然后你为每个属性提出{'1}}''ItSelf''。因此,只要在绑定中使用整个对象,就可以发出更新信号。
OnPropertyChanged
我让它的工作速度提高了一些,但我想测试public DateTime Start
{
get { return this.start; }
set { this.start = value; OnPropertyChanged("Start"); OnPropertyChanged("ItSelf");
}
就像@AnatoliiG所说的那样,所以我稍后会接受一个答案。
答案 1 :(得分:0)
如果在数据类型类上实现INotifyPropertyChange
接口,那么 负责通知类属性的更改。如果在具有类类型属性的视图模型类上实现INotifyPropertyChange
接口,则 负责通知对该属性的更改,在本例中为整个对象。
更新&gt;&gt;&gt;
是的......我相信你有一个ObservableCollection<Bar>
类型的属性。如果您为每个项目添加PropertyChanged
处理程序......:
foreach (Bar item in YourCollectionProperty) item.PropertyChanged +=
Item_PropertyChanged;
...然后你可以这样做:
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyPropertyChanged("YourCollectionProperty");
}
答案 2 :(得分:0)
只是说清楚:
您对集合中的项目有一些DataTemplate
。项目类型为Bar
。父列表的ItemsSource
是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");
}
}