WPF绑定没有路径与转换器,更新

时间:2013-11-13 10:18:04

标签: wpf data-binding

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

如何判断它必须更新?


我试着更具体:

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

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

3 个答案:

答案 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。父列表的ItemsSourceBar个对象的集合。如果特定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");
    }
}