可以/我应该在viewmodel中创建UserControl的实例吗?

时间:2015-03-04 18:16:39

标签: c# wpf mvvm user-controls

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

我的问题是,是否在MVVM模式中从我的主视图模型创建usercontrol对象? onSomeEvent方法下面的示例是我不确定的代码,如果这是我应该处理它的地方?这对我来说不合适,但我仍然围绕着mvvm。我应该在这里添加用户控件viewmodel吗?感谢您提供任何指导。

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>

然后我创建了一个这样的简单类来填充几个字段。

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;
        }
    }
}

然后在我的mainviewmodel中我这样做了:

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

1 个答案:

答案 0 :(得分:1)

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

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

这可能看起来像:

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

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