gpt4 book ai didi

c# - View 中的控件如何从 View 模型中获取特定数据?

转载 作者:太空狗 更新时间:2023-10-30 00:40:46 25 4
gpt4 key购买 nike

我有多个 View (用户控件),每个 View 都有自己的 ViewModel。为了在它们之间导航,我使用按钮。按钮显示来自相应 View 模型的图像和文本,还需要列和行(因为有大约 10 个 View :10 列,每列的行数不同)。

现在按钮是动态创建的(我为此制作了一个Navigator控件),对于 View 模型,我有基类来保存文本、图像、列和行。可用的 View 数量会有所不同(取决于用户级别和某些设置),这就是我需要在此处进行控制的原因。

问题:我的控件应如何从 View 模型获取数据?

现在我有接口(interface) INavigator,在(笑)控件本身中定义。 View 模型实现它。我可以反其道而行之,让我的控件了解 View 模型。两者看起来都不对。


有一个 Navigator 控件可以说 Items 绑定(bind)到 View 模型列表。它可以将每个 View 模型转换为INavigatorViewModelBase(所有页面通用)以获得特定的 View 模型图像、文本、列和行。所以要么 View 模型知道控件(实现INavigator),要么控件知道ViewModelBase。这是一个问题,解决方案都绑定(bind)了紧密的控件和 View 模型,这是mvvm 中的错误。


示意图 enter image description here

最佳答案

您绘制图表的方式回答了您自己的问题,即您应该如何为此构造代码。

您需要的是一个包含 MainVM 的虚拟机(我们称之为 ObservableCollection<VMBase>)其他虚拟机(使用您的基本类型,以便它们可以愉快地生活在同一个集合中)。

您的 View 需要 ItemsControl (绑定(bind)到你的 ObservableCollection<VMBase> )你指定一个 DataTemplate对于仅使用 VMBase 类型公开的属性的 Button。设置 Command Button 中的属性调用 SwitchCommand , CommandParameter设置为项目本身(即 {Binding .} )。

您的 View 还需要一个 ContentControl绑定(bind)到 SelectedVM属性(property) MainVM您可以填充它。

实现 SwitchCommand设置 SelectedVM属性基于 CommandParameter 的值。

public void ExecuteSwitchCommand(object parameter)
{
var vmBase = parameter as VMBase;
if (vmBase != null)
SelectedVM = vmBase;
}

这里提到的所有属性应该是INotifyPropertyChanged启用以便 View 在更改和更新 UI 时进行注册。

ContentControl 获取不同的 UI ,将每个特定 VM 类型的特定于类型的 DataTemplates 添加到 View 的资源文件中(或者如果您很聪明并且正在构建自定义插件框架,请合并资源字典)。

很多人忘记了 MVVM 的全部意义在于有意将 View 与 ViewModel 分开,这意味着您可以为单个 ViewModel 潜在地拥有多个 View ,这就是它所展示的。

关于c# - View 中的控件如何从 View 模型中获取特定数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com