【问题标题】:WPF Binding without path with converter, updateWPF 绑定没有带转换器的路径,更新
【发布时间】:2013-11-13 10:18:03
【问题描述】:

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

如何判断它必须更新?


我尝试更具体:

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

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

【问题讨论】:

  • string.empty提高PropertyChangedEvent
  • @Jehof 那行不通。

标签: wpf data-binding


【解决方案1】:

一种可能的解决方法是:

给您的对象一个 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 所说的那样,所以我稍后会接受答案。

【讨论】:

    【解决方案2】:

    只是为了说清楚: 您有一些 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");
        }
    }
    

    【讨论】:

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

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


    更新>>>

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

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

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

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

    【讨论】:

    • 我添加了更多细节。属性更改时对象是否应该通知视图模型?通常不知道视图模型。
    • 这是否意味着他希望整个集合都发生变化,然后重新绘制所有条形图,而不仅仅是特别改变的那个?
    • 这不起作用。 NotifyPropertyChanged 不会重绘该栏。我猜他检查并发现集合与以前相同。但是当在Item_PropertyChanged 中时,我会执行collection.Remove(sender)collection.Add(sender) 它会更新 - 因为该栏已被删除并重新添加。不确定是否是最好的解决方案。仍在测试其他人。
    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 2013-01-09
    • 2012-07-20
    • 2013-05-09
    • 2014-12-02
    • 1970-01-01
    • 2014-03-04
    • 2011-04-27
    相关资源
    最近更新 更多