Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# 强制从XAML实例化ViewModel_C#_Wpf_Mvvm - Fatal编程技术网

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}" />