c# - WPF MVVM 更改模型

标签 c# wpf xaml mvvm user-controls

我有一个 UserControl,数据通过依赖属性传入。
UserControl 由 View 模型支持,并且数据被分配给 View 模型的属性。

XAML 绑定(bind)到 View 模型中的属性以及传入数据中的属性。

问题是如果用户更改数据,那么与 UI 的数据绑定(bind)就会中断。 UI 仍然绑定(bind)到原始数​​据对象。

如何使绑定(bind)刷新? INotifyPropertyChanged 贯穿始终,但变得陈旧的不是属性,而是绑定(bind)。基本上,您如何更换支持模型?

由于我不确定我的描述是否清楚,我将尝试用伪代码再次描述它。

<MyControl Source="{Binding Data}"/>

其中 source 是 MyControl 的依赖属性。在 PropertyChangedCallback 中,此数据被传递给 View 模型。
MyViewModel.Data = Source;

在 MyControl XAML 中,事物绑定(bind)到此模型。
{Binding Path=MyViewModel.Data.Item}

如果你想知道为什么在 UserControl 中定义了依赖属性,那是因为它是一个可重用的控件,最终用户不应该知道 View 模型。

最佳答案

“用户控件由 View 模型支持”,从而破坏了应用程序。

UserControl 的 DataContext 应该是模型。时期。如果您需要执行 UI 逻辑,请在代码隐藏中执行。需要别的东西吗?在 UserControl 的表面上创建 DependencyProperties 以提供它们。

当您专门为您的 UserControl 创建 ViewModel 时,您破坏了 DataContext(此时,可能是 UC 设计使用的模型)和 UserControl 内的绑定(bind)的自然流程。在大多数情况下它是没有意义的,并且在某些情况下是有害的(正如你已经注意到的)。

My canonical answer on the subject contains more details .

关于c# - WPF MVVM 更改模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308090/

相关文章:

c# - 从 ASP.Net MVC 中的变量生成 href 值

javascript - 将 jQuery 单击事件添加到生成按钮后面的代码

wpf - 如何禁用基于 wpf 中另一个组合框的组合框

c# - MediaPlayerElement 循环播放视频 UWP 的问题

c# - 使用 C# mongodb 驱动程序时的 Mongodb 性能

c# - 为什么我的 C# 应用程序不能在不同的机器上执行?

c# - 如何将事件从用户控件冒泡到包含该事件的窗口?

c# - 如何使用上一个/下一个按钮循环浏览 XML 文件中的记录?

c# - Xamarin Forms Android 中任何页面的默认背景颜色是什么?

wpf - 如何使自定义控件的元素在 View 上可访问以将其订阅命令?