gpt4 book ai didi

c# - 用于基于选项卡控件的应用程序的 MVVM

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:46 25 4
gpt4 key购买 nike

在我的 wpf 应用程序中,主视图有 5 个选项卡和 5 个不同的用户控件,因为用户控件彼此不相关,所以我创建了 5 个不同的 View 模型(除了主视图模型)。

我想有一个列表或字典来包含用户控件及其 View 模型的列表,现在,我想将 tabitem 与用户控件列表绑定(bind)并分配数据上下文,但是由于可以更改列表或字典,我找不到将用户控件绑定(bind)到 tabitem 的方法。

例如,如果我有一个将与我可以分配的用户控件相关联的选项卡

 tab1View tview=new tab1View();
tview.DataContext= new tab1ViewModel();
tab1.Content=tview;

但是我怎样才能从具有用户控件的 View 和 View 模型的引用的列表中执行相同的操作?

请教我实现此目标的最佳方法。

**答案:**

I got the answer for what I need. First, Generic type collection of the view models should be created C# - Multiple generic types in one list

public abstract class Metadata
{
}

public class Metadata<DataType> : MetaData where DataType : class
{
private DataType mDataType;
}
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<tab1ViewModel>());
metadataObjects.Add(new Metadata<tab2ViewModel>());

如果要使用相同的 View 模型引用多个 View 或仅应用数据模板,则创建一个数据模板选择器

最佳答案

有几种方法可以解决这个问题,但我会考虑使用框架来帮助您处理 MVVM。我自己宣传Prism .

View Injection


View Discovery


数据模板 - Sample

使用 DataTemplates,您可以在 XAML(或代码,但更有可能是 XAML)中定义哪个 View “自动”应用于基于 View 模型 (DataContext) 的 ContentControl

XAML 资源中的某处:

<DataTemplate DataType="{x:Type ViewModel:GeneralSettingsViewModel}">
<View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:AdvancedSettingsViewModel}">
<View:AdvancedSettingsView/>
</DataTemplate>

XAML 文件中应用了资源的某处:

 <TabControl ItemsSource="{Binding MyViewModelCollection}" />

注意:这仅适用于范围资源中每个 DataTemplate 有一个 View 模型的情况。


数据模板选择器

如果您有一个可以应用于多个 View 的 View 模型,并且您通过附加逻辑确定这些 View ,您可能希望使用 DataTemplateSelector。这是一个例子:

XAML 资源中的某处:

<!-- Possible collision because the DataType is of the same type -->
<DataTemplate x:Key="GeneralSettingsTemplate"
DataType="{x:Type ViewModel:SettingsViewModel}">
<View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate x:Key="AdvancedSettingsTemplate"
DataType="{x:Type ViewModel:SettingsViewModel}">
<View:AdvancedSettingsView/>
</DataTemplate>
<local:SettingsDataTemplateSelector x:Key="SettingsTemplateSelector"
GeneralSettingsTemplate="{StaticResource GeneralSettingsTemplate}"
AdvancedSettingsTemplate="{StaticResource AdvancedSettingsTemplate}" />

XAML 文件中应用了资源的某处:

<TabControl ItemsSource="{Binding MyViewModelCollection}"
ItemTemplateSelector="{StaticResource SettingsTemplateSelector}" />

SettingsTemplateSelector.cs:

public class SettingsDataTemplateSelector : DataTemplateSelector
{
public DataTemplate GeneralSettingsTemplate { get; set; }
public DataTemplate AdvancedSettingsTemplate { get; set; }

public override DataTemplate SelectTemplate(Object item,
DependencyObject container)
{
var vm = item as SettingsViewModel;

if (vm == null) return base.SelectTemplate(item, container);

if (vm.IsAdvanced)
{
return AdvancedSettingsTemplate;
}

return GeneralSettingsTemplate;
}
}

MSDN:棱镜导航 - http://msdn.microsoft.com/en-us/library/gg430861(v=PandP.40).aspx
这涵盖了 Prism 区域以及导航的其他部分。

MSND:View Discovery 与 View Injection - http://msdn.microsoft.com/en-us/library/ff921075(v=pandp.20).aspx
本节介绍 View Discovery 和 View Injection 的区别以及何时使用它们。

关于c# - 用于基于选项卡控件的应用程序的 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8031837/

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