gpt4 book ai didi

c# - 为不同的 ViewModel 但相同的属性动态显示不同的 View

转载 作者:行者123 更新时间:2023-12-03 10:13:32 27 4
gpt4 key购买 nike

好的,我正在尝试掌握 MVVM。我有一个应用程序有多个图像捕获选项。根据模式,图像要么从现有文件加载,要么从相机捕获。

我正在使用代表图像捕获设备配置的 MVVM 模式编写一个页面。

该模型由两个类组成,它们公开了符合 IImageSource 公共(public)接口(interface)的每个模式的特定(和非公共(public))值。

两个模型类中的每一个都有一个上下文定义的 View 模型:

  • CameraSourceViewModel
  • FileSourceViewModel

和两个相应的 View 。

  • CameraSourceView
  • FileSourceView

该模型有一个返回 IImageSource 的属性。

我目前正在使用第三个 View ,ImageSourceView 作为页面。我正在处理从模型中获取值的加载事件,然后根据类型实例化正确的 View 模型和正确的 View ,然后将其添加为内容。然而,这似乎违背了 MVVM 的精神,因为我现在在代码后面写了一些决策代码

是否有更优雅/更好的方法来确定应实例化和使用哪个 View 模型/ View ?

最佳答案

实际上,您不需要 TemplateSelector,因为这两个 ViewModel 将具有不同的类型。您可以将 XAML 中的 DataTemplates 声明为以模型类型为键的资源,以便 WPF 自动选择正确的 DataTemplate:

  • 有一个主 ViewModel,它公开了一个 ImageSourceViewModel 属性。此属性将根据需要返回 CameraSourceViewModel 或 FileSourceViewModel。
  • 在您的页面中,DataContext 将是主要的 ViewModel,您将拥有如下 XAML:

代码示例:

<Page x:Class="Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:my="clr-namespace:WpfApplication1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="Page1">
<Page.Resources>
<DataTemplate DataType="{x:Type my:CameraSourceViewModel}">
<my:CameraSourceView/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:FileSourceViewModel}">
<my:FileSourceView/>
</DataTemplate>
</Page.Resources>
<Grid>
<ContentControl Content="{Binding ImageSourceViewModel}"/>
</Grid>
</Page>

关于c# - 为不同的 ViewModel 但相同的属性动态显示不同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447454/

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