【问题标题】:Using dependency property default value as binding source使用依赖属性默认值作为绑定源
【发布时间】:2015-10-17 23:37:58
【问题描述】:

我不得不使用旧的 silverlight 应用程序,遇到了一段奇怪的代码。 viewmodel 有一个 List 依赖属性作为网格的绑定源。这个 DP 有一个默认值,一个在应用程序中全局使用的另一个 List。这用于在应用程序的不同部分之间轻松共享实体数据。

DependencyProperty MyEntitiesProperty = DependencyProperty.Register("MyEntities", typeof(List<Entity>), typeof(...), new PropertyMetadata(Global.Entities));

现在,当列表更改时(在用户操作上),全局列表会从数据库中重新填充,但从未明确设置 MyEntities。这不起作用:网格(绑定目标)永远不会改变。所以这是一个错误的解决方案。

我推测所有这一切背后的想法可能如下:如果您有一个具有给定值的 DP,并且您从未为其设置本地值,那么 DP 的有效值将是默认值。如果更改了“基础”默认值,则更改会反映在有效值中。

如果它有效,这是在独立视图模型之间共享数据的好方法,而无需摆弄属性更改事件等。

这里有什么问题?是对 DP 的工作方式有很大的误解,还是想法没问题而遗漏了一些实施细节?

如果有不清楚的地方请评论。

【问题讨论】:

  • 您写道“全局列表是从数据库中重新填充的”,而我将其解读为“列表实例保持不变,仅删除项目并再次添加更新的项目”。我在这里错了吗?因为如果列表实例在应用程序生命周期内相同或创建新的列表实例,则存在很大差异。
  • Martin,我了解添加/删除项目和设置新项目参考之间的区别。它如何影响 DP 的绑定行为?在实际代码中,创建了一个新列表。
  • 您的问题解决了吗?

标签: silverlight data-binding viewmodel dependency-properties


【解决方案1】:

好吧,考虑到您的评论,对 DP 的工作方式存在很大误解。让我解释一下:

将全球已知的列表设置为 MyEntities 的默认值可能不是我推荐的模式,但在技术上并没有问题,可以共享列表。 MyEntities 现在拥有对这个列表的引用。

如果您现在用新的列表实例替换全局列表,旧的实例不会停止存在。您的属性 MyEntities 仍然包含对旧列表的引用。只有通过Binding 绑定到通过INotifyPropertyChanged 机制连接的普通属性或另一个DP 时,DP 的值才会自动更新。

设置默认值既不是通过Binding 对普通属性进行,也不是通过Binding 对另一个DP,它只是一个普通的旧对象引用。

我可以想出几种方法来纠正这种情况:

第一个解决方案

如果全局列表实现INotifyCollectionChanged(例如ObservableCollectionDependencyObjectCollection),您可以 - 而不是创建新的列表实例 - 只需从列表中删除旧项目并添加新项目。引用列表的视图将在收到关联的CollectionChanged 事件后立即执行更新。

第二种解决方案

确保Global.Entities 列表可用并且始终作为根视图的DataContext 上的公共属性(与INotifyPropertyChanged 连接)是最新的。现在,当您希望将 UI 树内部某处的嵌套视图连接到此 Global.Entities 列表时,您可以将其绑定到根视图的 DataContext 的公共列表属性。

<MyRootView>
    ... nested views spread across multiple files ...
    <MyNestedEntitiesListDisplay
        MyEntities="{Binding
            Path=DataConext.GlobalEntities,
            RelativeSource={RelativeSource AncestorType=MyRootView}}"/>

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2011-12-01
    • 1970-01-01
    • 2017-06-13
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多