有关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));
}
答案 0 :(得分:1)
不,您的viewmodel不应创建任何UserControl
个实例,因为它们是视图。此外,您的主视图模型不应包含任何视图的任何集合。正如@BradleyDotNET所提到的,DataTemplate
是正确的方式。
您应该更改主viewmodel集合。它不应该包含任何UserControl
s(视图),而应包含它们的视图模型。假设您已经为XAML中的子视图模型定义了DataTemplate
,您将获得WPF自动创建的视图。
这可能看起来像:
<DataTemplate DataType = "{x:Type local:UserControlViewModel}">
<local:UserControl/>
</DataTemplate>
使用这种方法,WPF会自动将DataContext
属性值设置为子视图模型实例,因此您可以轻松地在UserControl
中定义绑定。