【问题标题】:Binding failures when adding another property添加其他属性时绑定失败
【发布时间】:2010-12-13 10:42:57
【问题描述】:

我有一个像这样绑定到子视图的主视图(支持属性的类型为object):

<ContentControl Content="{Binding WalletsView}"/>

现在,我在相应的视图模型中添加了另一个属性,即

public SmartObservableCollection<Selectable<Type>> PriceGrabbers {get; private set;}

其中SmartObservableCollection 派生自ObservableCollection,以便更轻松地进行多线程更新。

现在我得到很多绑定错误(实际上,子视图模型中的 all 绑定通过调试窗口运行)像这样(有趣的是,如果我再次删除 PriceGrabbers 属性,所有错误消失):

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainWindowViewModel”(HashCode=30986197)上找不到“OverviewHidden”属性。 BindingExpression:Path=OverviewHidden; DataItem='MainWindowViewModel' (HashCode=30986197);目标元素是'ColumnDefinition'(HashCode=22768693);目标属性是“NoTarget”(类型“对象”)

因此绑定引擎显然会尝试在主视图模型上查找所有绑定。 绑定工作得很好。虽然这没关系,但我宁愿让错误消失。有没有人遇到过这个问题,如果有,你们是怎么解决的?

【问题讨论】:

  • MainWindowViewModel 是否有一个名为 OverviewHidden 的属性?
  • 不,它没有。所有绑定失败都来自子视图。 MainViewModel 做了两件事:a) 提供主菜单 b) 将所有其他视图放在选项卡控件中。因此,显然子视图首先尝试使用错误的 ViewModel 作为 DataContext。绑定工作正常。

标签: wpf binding


【解决方案1】:

问题不在于 WPF,而在于我使用 MEF 作为组合容器。该属性修改类的导入顺序,将MainWINdow对应的ViewModel先分配给所有View,再分配正确的View。当数据上下文被刷新时,所有的绑定都会被更新,因此应用程序可以工作。

编辑,现在我找到了完整的原因。

SmartObservableCollection 采用Action&lt;Action&gt;&gt; 参数在CollectionChanged 事件上执行,这是必需的,因为我的大多数集合都以多线程方式更新,但事件必须在 GUI 线程中执行,否则你会出现异常。

为此,我的视图将 Dispatcher.Invoke()Dispatcher.BeginInvoke() 公开为方法,然后我将它们提供给集合。

在启动时,DataContexts 在基类ViewModel 中通过以下几行进行分配:

Dispatcher.CurrentDispatcher.BeginInvoke((Action)delegate()
{
    view.DataContext = this;
});

谁已经有了想法?

这个问题的原因很简单,我向集合提供了 Dispatcher.Invoke() 方法而不是 Dispatcher.BeginInvoke()。通过这样做(以及它在MainWindowViewModel 中使用的事实),它在any DataContexts 被分配给其他ViewModels 之前被执行。

现在,进行下一步 - WPF 引擎尝试绑定到子视图中的数据。由于DataContextnull,绑定引擎沿着可视化树向上走,直到找到一个集合DataContext,在这种情况下,第一个集合DataContext 在MainWindowView,它是MainWindowViewModel。现在,在集合完成后,所有其他操作都被调用并适当分配 DataContext,从而重新执行绑定引擎,该引擎在子视图上找到非空 DataContext 并正确绑定。

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多