C# 强制从XAML实例化ViewModel
我有一个视图C# 强制从XAML实例化ViewModel,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个视图outputoptionview,其中包含多个用户控件,选项设置根据组合框的选择而显示 我在outputoptionview中为UserControls创建Datacontext和Datatemplates,如下所示: <UserControl.Resources> <ResourceDictionary> <local:OutputOptionsViewModel x:Key="vm" /> <Da
outputoptionview
,其中包含多个用户控件
,选项设置根据组合框的选择而显示
我在outputoptionview
中为UserControls
创建Datacontext
和Datatemplates
,如下所示:
<UserControl.Resources>
<ResourceDictionary>
<local:OutputOptionsViewModel x:Key="vm" />
<DataTemplate x:Key="OptionSettings1" DataType="{x:Type views:OptionSettings1View}">
<views:OptionSettings1View />
</DataTemplate>
<DataTemplate x:Key="OptionSettings2" DataType="{x:Type views:OptionSettings2View}">
<views:OptionSettings2View />
</DataTemplate>
....
</ResourceDictionary>
</UserControl.Resources>
组合框的ItemsSource
和SelectedIndex
绑定到OutputOptions视图的viewmodel类OutputOptions viewmodel
:
<ComboBox Name="AvailableOptionsListComboBox" ItemsSource="{Binding AvailableOptionsList}" DisplayMemberPath="OptionTitle"
SelectedIndex="{Binding AvailableOptionsListSelectedIndex, UpdateSourceTrigger=PropertyChanged}"/>
现在,我的问题涉及组合框的总体。我创建了一个包含OptionTitle的接口,每个optionSettingsViewModels
都继承了该接口AvailableOptions列表
是组合框的项摘要
是此界面的列表
public List<IOutputOption> AvailableOptionsList { get; set; }
这会导致以下问题:只要选项SettingsView未实例化,组合框就不会填充,但无法实例化,因为无法从空组合框中选择它们。
因此,我希望强制实例化optionSettingsView 这些评论让我觉得,有一些基本的误解:
[Lynn Crankling]我会完全重新构建它,以始终实例化所有视图模型,将它们嵌套在mainviewmodel下。您将需要它们,那么为什么不在主vm的ctor中启动它们呢
及
[Roland Deschain]这实际上是我目前解决问题的方法,但是这意味着我必须在每个选项的代码后面设置datacontext SettingsViewModel,如果可能的话,这是我想要避免的
因此,正如Lynn所说,您应该首先在主viewmodel中注册子viewmodels,此时不需要任何视图参与
然后,您可以为视图模型定义DataTemplate
,而不是像现在这样为视图定义DataTemplate
<DataTemplate DataType="{x:Type viewmodels:OptionSettings1ViewModel}">
<views:OptionSettings1View />
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodels:OptionSettings2ViewModel}">
<views:OptionSettings2View />
</DataTemplate>
“包含多个用户控件”的视图模型首先是糟糕的设计。它应该包含几个子视图模型,并且用户控件应该由子视图模型类型的DataTemplates实例化。@Clemens我指的是视图
,已经在OP中编辑过,对不起。因此,每个ViewModel
只有一个视图。无论如何,如果只将DateTemplate的数据类型设置为某个类型,而不应用x:Key
,则在将该类型的实例分配给ContentControl的Content属性时,将自动使用该数据模板。“从XAML实例化视图模型”,即从视图实例化是错误的。应该为视图模型创建视图。@克莱门斯,很抱歉,我不明白你的意思,我应该这样做。@grek40很公平,我完全重新开始,重新写了这个问题。我希望事情现在解释得更好一点。Thx,我将在接下来的几天里测试它!刚刚测试了一下,效果很好。谢谢!
public List<IOutputOption> AvailableOptionsList { get; set; }
public OptionSettings1ViewModel()
{
OutputOptionsViewModel.AvailableOptionsList.Add(this);
}
<DataTemplate DataType="{x:Type viewmodels:OptionSettings1ViewModel}">
<views:OptionSettings1View />
</DataTemplate>
<DataTemplate DataType="{x:Type viewmodels:OptionSettings2ViewModel}">
<views:OptionSettings2View />
</DataTemplate>
<ContentControl
Name="OutputOptionsContentControl"
Content="{Binding ElementName=AvailableOptionsListComboBox,Path=SelectedItem}" />