Can/Should 我在视图模型中创建了 UserControl 的实例?

Can/Should I create instances of a UserControl in my viewmodel?

有关 UserControls 和 MVVM 的问题。我的 wpf 应用程序有一个主 View/ViewModel。视图模型有一个列表框绑定到的我的用户控件的 ObservableCollection。 UserControl 实例根据事件在 运行 时间添加到集合中。

我的问题是从我的主视图模型创建用户控件对象是否属于 MVVM 模式?下面在 onSomeEvent 方法中的示例是我不确定的代码,如果这是我应该处理的地方?这对我来说感觉不对,但我仍然在考虑 mvvm。我应该在这里添加用户控件视图模型吗?感谢您的指导。

private ObservableCollection<string> myList = new ObservableCollection<string>();
public ObservableCollection<string> MyList
{
    get { return myList; }
    set
    {
        myList = value;
        RaisePropertyChangedEvent("MyList");
    }
}

public void onSomeEvent(string someData1, string someData2)
    {
        this.MyList.Add(new Views.MyUserControl(someData1, someData2));
    }

好的,我根据 BradleyDotNET 和 dymanoid 的反馈模拟了一些代码,同时全神贯注。粘贴在这里看看我是否在正确的轨道上。

我修改了主视图中的列表框 xaml 以添加模板:

<ListBox Name="lbMain" Margin="10" ItemsSource="{Binding MyList, Mode=TwoWay}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <WrapPanel>
                    <TextBlock Text="{Binding Test1}" FontWeight="Bold" />
                    <TextBlock Text="{Binding Test2}" FontWeight="Bold" />
                </WrapPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

然后我创建了一个像这样的简单 class 来填充一些字段。

public class MyData
{
    public MyData(string test1, string test2)
    {
        this.Test1 = test1;
        this.Test2 = test2;
    }
    private string test1;
    public string Test1
    {
        get
        {
            return test1;
        }
        set
        {
            test1 = value;
        }
    }

    private string test2;
    public string Test2
    {
        get
        {
            return test2;
        }
        set
        {
            test2 = value;
        }
    }
}

然后在我的主视图模型中我这样做了:

public void onSomeEvent(string someData1, string someData2)
    {
        this.MyList.Add(new MyData(someData1, someData2));
    }

不,您的视图模型不应创建任何 UserControl 实例,因为它们是视图。此外,您的主视图模型不应包含任何视图的任何集合。正如@BradleyDotNET 提到的,DataTemplate 是正确的方法。

您应该更改主视图模型集合。它不应包含任何 UserControls(视图),而是它们的视图模型。假设您已经在 XAML 中为您的子视图模型定义了 DataTemplates,您将获得 WPF 自动创建的视图。

这可能看起来像:

<DataTemplate DataType = "{x:Type local:UserControlViewModel}">
    <local:UserControl/>
</DataTemplate>

使用这种方法,WPF 会自动将 DataContext 属性 值设置为子视图模型实例,因此您可以轻松地在 UserControl.[=17= 中定义绑定]