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