我有多个视图(用户控件),每个视图都有自己的ViewModel. 为了在它们之间导航,我使用按钮。按钮显示来自相应视图模型的图像和文本,并且还需要列和行(因为有 10 个视图:10 个列,每个列的行数不同)。
现在按钮是动态创建的(我为此做了一个Navigator控件),对于视图模型,我有基类来保存文本、图像、列和行。可用的视图数量会有所不同(取决于用户级别和某些设置),这就是我需要在这里进行控制的原因。
问题:我的控件如何从视图模型中获取数据?
现在我有 interface INavigator,在(lol)控件本身中定义。并且视图模型实现了它。我可以去对面,让我的控制,以了解有关视图模型。两者看起来都不对。
有一个Navigator控件,可以说,Items绑定到视图模型列表。它可以将每个视图模型投射到INavigator或ViewModelBase(所有页面通用)以获取特定的视图模型图像、文本、列和行。因此,要么视图模型知道控制(实现INavigator),要么控制知道ViewModelBase.. 这是一个问题,这两个解决方案都绑定了紧密的控制和视图模型,这在mvvm.
示意图

您绘制图表的方式回答了您自己的问题,即您应该如何为此构建代码。
您需要的是一个虚拟机(我们称之为MainVM),其中包含ObservableCollection<VMBase>其他 VM(使用您的基本类型,以便它们都可以愉快地生活在同一个集合中)。
您的 View 需要一个ItemsControl(绑定到您的ObservableCollection<VMBase>),您DataTemplate仅使用 VMBase 类型公开的属性为 Button 指定 a 。Command将Button 中的属性设置为 call SwitchCommand,CommandParameter设置为项目本身(即{Binding .})。
您的视图还需要ContentControl绑定到SelectedVM属性MainVM可以填充的
实现根据 CommandParameter 的值SwitchCommand设置属性。SelectedVM
public void ExecuteSwitchCommand(object parameter)
{
var vmBase = parameter as VMBase;
if (vmBase != null)
SelectedVM = vmBase;
}
Run Code Online (Sandbox Code Playgroud)
这里提到的所有属性都应该是INotifyPropertyChanged以便视图在更改和更新 UI 时进行注册。
要获得不同的 UI ContentControl,请将每个特定 VM 类型的特定于类型的 DataTemplate 添加到视图的资源文件中(或者,如果您很聪明并且正在构建自定义插件框架,请合并资源字典)。
很多人忘记了 MVVM 的重点是 View 与 ViewModel 有目的的分离,这意味着单个 ViewModel 可能有多个 View,这就是这个演示的内容。
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |