在 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 也支持这种方法,而删除该方法会使区域的使用范围大大降低。