在 WPF Prism 中将模型与 ViewModel 绑定
Bind Model with the ViewModel in WPF Prism
假设我动态地创建了一堆模型 classes(比如在启动时基于一些配置文件内容),假设每个模型都是 class CarModel 的一个实例:
public class CarModel
{
public string CarName { get; private set; }
public CarModel(string carName)
{
CarName = carName;
}
}
然后将它们全部添加到 ObservableCollection CarList 中,然后在 XAML 中的视图中表示:
<Window.Resources>
<DataTemplate DataType="{x:Type models:CarModel}">
<views:CarView></views:CarView>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding CarList}">
</ListBox>
然后我通过 Prism AutoWireViewModel 将 CarView 绑定到 CarViewModel。
我使用 CarViewModel 是因为我有一堆额外的(仅与视图相关的)属性,并且还处理我不想包含在我的原始 CarModel 中的导航和事件(通过 eventAggregator)。
我的问题是,如何绑定(或 link)我的 CarViewModel 与创建查看?
how do I bind (or link) my CarViewModel with the original CarModel that created the view?
要么导航到视图并在导航参数中传递相应的模型,要么(首选)自己创建视图模型(通过工厂)而不是使用视图模型定位器并使用其模型对其进行初始化。
也就是说,CarList
应该包含CarViewModel
。如果你需要完全双向同步(列表被数据库和视图同时更改),这意味着很多样板代码,但大多数时候,你根本不需要同步......所以 IReadOnlyColletion<CarViewModel
就足够了(而不是成熟的 ObservableCollection
),它可以用一个简单的 Select
.
初始化一次
提示:视图模型定位器主要用于顶级视图,大多数时候你最好创建视图模型并将其链接到带有 DataTemplate
的视图,即去查看模型优先。事实上,即使在导航区域时,早期版本的 prism 也支持这种方法,而删除该方法会使区域的使用范围大大降低。
假设我动态地创建了一堆模型 classes(比如在启动时基于一些配置文件内容),假设每个模型都是 class CarModel 的一个实例:
public class CarModel
{
public string CarName { get; private set; }
public CarModel(string carName)
{
CarName = carName;
}
}
然后将它们全部添加到 ObservableCollection CarList 中,然后在 XAML 中的视图中表示:
<Window.Resources>
<DataTemplate DataType="{x:Type models:CarModel}">
<views:CarView></views:CarView>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding CarList}">
</ListBox>
然后我通过 Prism AutoWireViewModel 将 CarView 绑定到 CarViewModel。 我使用 CarViewModel 是因为我有一堆额外的(仅与视图相关的)属性,并且还处理我不想包含在我的原始 CarModel 中的导航和事件(通过 eventAggregator)。
我的问题是,如何绑定(或 link)我的 CarViewModel 与创建查看?
how do I bind (or link) my CarViewModel with the original CarModel that created the view?
要么导航到视图并在导航参数中传递相应的模型,要么(首选)自己创建视图模型(通过工厂)而不是使用视图模型定位器并使用其模型对其进行初始化。
也就是说,CarList
应该包含CarViewModel
。如果你需要完全双向同步(列表被数据库和视图同时更改),这意味着很多样板代码,但大多数时候,你根本不需要同步......所以 IReadOnlyColletion<CarViewModel
就足够了(而不是成熟的 ObservableCollection
),它可以用一个简单的 Select
.
提示:视图模型定位器主要用于顶级视图,大多数时候你最好创建视图模型并将其链接到带有 DataTemplate
的视图,即去查看模型优先。事实上,即使在导航区域时,早期版本的 prism 也支持这种方法,而删除该方法会使区域的使用范围大大降低。