Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于基于控件的应用程序的MVVM_C#_Wpf_Data Binding_Mvvm - Fatal编程技术网

C# 用于基于控件的应用程序的MVVM

C# 用于基于控件的应用程序的MVVM,c#,wpf,data-binding,mvvm,C#,Wpf,Data Binding,Mvvm,在我的wpf应用程序中,主视图有5个选项卡,其中包含5个不同的用户控件,因为用户控件彼此不相关,所以我创建了5个不同的视图模型(除了主视图模型) 我想用一个列表或字典来列出用户控件及其视图模型, 现在,我想用usercontrols列表绑定tabitems并分配DataContext,但是由于列表或字典可以更改,我没有找到将usercontrols绑定到tabitems的方法 例如,如果我有一个选项卡,它将与我可以分配的usercontrol关联 tab1View tview=new tab1

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

我想用一个列表或字典来列出用户控件及其视图模型, 现在,我想用usercontrols列表绑定tabitems并分配DataContext,但是由于列表或字典可以更改,我没有找到将usercontrols绑定到tabitems的方法

例如,如果我有一个选项卡,它将与我可以分配的usercontrol关联

 tab1View tview=new tab1View();
 tview.DataContext= new tab1ViewModel();
 tab1.Content=tview;
但是,如何从一个包含usercontrols的view和viewmodels引用的列表中执行相同的操作呢

请教我实现这一目标的最佳方法

**答复:**

我得到了我需要的答案。 首先,应该创建视图模型的泛型类型集合

公共抽象类元数据
{
}
公共类元数据:数据类型为class的元数据
{
私有数据类型mDataType;
}
列出元数据对象;
添加(新元数据());
添加(新元数据());

然后,如果要使用同一viewmodel引用多个视图,请创建DataTemplate选择器,或者仅应用DataTemplate创建一个viewmodel集合,并将其绑定到选项卡控件的ItemsSource。然后创建一个DataTemplateSelector,为每个viewmodel选择一个视图。

创建一个viewmodels集合,将其绑定到选项卡控件的ItemsSource。然后创建一个DataTemplateSelector,为每个viewmodel选择一个视图。

有几种方法可以处理这个问题,不过我会考虑使用框架来帮助您使用MVVM。我自己提拔



数据模板-

使用在XAML中定义的数据模板(或在代码中定义,但XAML更可能),哪个视图“自动”应用于基于视图模型(DataContext)的
ContentControl

在XAML资源中的某个地方:

<DataTemplate DataType="{x:Type ViewModel:GeneralSettingsViewModel}">
    <View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:AdvancedSettingsViewModel}">
    <View:AdvancedSettingsView/>
</DataTemplate>
<!-- 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}" />
<TabControl ItemsSource="{Binding MyViewModelCollection}"
            ItemTemplateSelector="{StaticResource SettingsTemplateSelector}" />

MSDN:Prism导航-
这包括棱镜区域以及导航的其他部分

MSND:视图发现与视图注入-

本节介绍了视图发现和视图注入的区别以及何时使用它们。

有几种方法可以解决这个问题,不过我会介绍如何使用框架来帮助您使用MVVM。我自己提拔



数据模板-

使用在XAML中定义的数据模板(或在代码中定义,但XAML更可能),哪个视图“自动”应用于基于视图模型(DataContext)的
ContentControl

在XAML资源中的某个地方:

<DataTemplate DataType="{x:Type ViewModel:GeneralSettingsViewModel}">
    <View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:AdvancedSettingsViewModel}">
    <View:AdvancedSettingsView/>
</DataTemplate>
<!-- 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}" />
<TabControl ItemsSource="{Binding MyViewModelCollection}"
            ItemTemplateSelector="{StaticResource SettingsTemplateSelector}" />

MSDN:Prism导航-
这包括棱镜区域以及导航的其他部分

MSND:视图发现与视图注入-

本节介绍视图发现和视图注入的区别以及何时使用它们。

除非
DataObject
为其余代码提供了有用的接口,否则我建议只列出
object
。您的视图仍然可以绑定到它,并且您不必从一个不提供封装好处的附加类派生,也不会使代码混乱。请使用ObservableCollection,而不是List。@m-y:如果列表没有更改,则List不是一个坏的选择。除非
DataObject
为您的其余代码提供了一个有用的接口,我建议只列出
对象
。您的视图仍然可以绑定到它,并且您不必从一个不提供封装好处的附加类派生,也不会使代码混乱。请使用ObservableCollection,而不是List。@m-y:如果列表没有更改,则List不是一个错误的选择。
DataTemplateSelector
是不必要的。只有当您有一个可以应用于多个视图的视图模型时,您才真正需要它,在这种情况下,您需要额外的逻辑来确定返回哪个
DataTemplate
,否则会导致冲突。请参阅我的答案更新,其中显示了一个示例。不需要
DataTemplateSelector
。只有当您有一个可以应用于多个视图的视图模型时,您才真正需要它,在这种情况下,您需要额外的逻辑来确定返回哪个
DataTemplate
,否则会导致冲突。请参阅我的答案的更新,其中显示了一个示例。您好,我实现了您的示例,效果非常好:)谢谢您好,我实现了您的示例,效果非常好:)谢谢