gpt4 book ai didi

.net - 使用设计时的声明性数据上下文和运行时的数据模板连接 MVVM View 和 View 模型?

转载 作者:行者123 更新时间:2023-12-04 14:33:23 25 4
gpt4 key购买 nike

是否可以同时使用声明性数据上下文和数据模板来连接 View 和 View 模型?

目标 :我想在设计时将 View 与一个 View 模型连接起来,而在运行时将另一个 View 模型连接起来。目前,为设计时 VM 使用声明性 DataContext 和为运行时使用数据模板指定的 VM 的行为不符合预期。

背景 - 有多种方法可以连接 View 和 ViewModel,包括:

A.) 在 View 的 XAML 中以声明方式指定 ViewModel DataContext .此技术在设计时使用无参数构造函数传入虚拟数据很有用。

<UserControl.DataContext>
<my: BrowseAssetsViewModel />
</UserControl.DataContext>

B.) 以编程方式指定 ViewModel、View 和 DataContext .
// …Setup code
BrowseAssetsViewModel viewModel = new BrowseAssetsViewModel(assetRegistry, domains);
BrowseAssetsView view = new BrowseAssetsView();
view.DataContext = viewModel;

当方法 B 与方法 A 结合使用时,在运行时 WPF 使用 ViewModel 的版本和方法 B 中指定的参数化构造函数覆盖方法 A 中指定的默认 DataContext。

C.) 为 View-ViewModel 关联定义数据模板
通过在 App.XAML Application.Resources 中关联 View 和 ViewModel,WPF 可以根据 ViewModel 的类型连接正确的 View。
<DataTemplate DataType="{x:Type vm: BrowseAssetsViewModel }">
<vw: BrowseAssetsView />
</DataTemplate>

如果 ViewModel 属性绑定(bind)到 ContentPresenter 控件,WPF 将连接相应的 View(基于 ViewModel 的类型)并将其放置在 ContentPresenter 中。这在“ViewModel-first”场景中很有用,其中 ViewModel 被呈现,WPF 通过检查呈现的 ViewModel 的类型来解析和连接正确的 View。

问题 - 当将此方法 C 与方法 A 结合使用时,WPF 会解析正确的 View ,但它似乎会重新查询 View ,通过无参数构造函数(方法 A)调用以声明方式指定的 ViewModel,从而覆盖现有的 ViewModel 属性!

问题 - 有没有一种方法可以同时使用这些技术(C 和 A),而 A 不会无意中覆盖 C ViewModel 属性?

最佳答案

您可以指定 DataContext 仅在设计时设置以防万一,如下所示:

<UserControl ...
d:DataContext="{d:DesignInstance my:BrowseAssetsViewModel}"
>

详情见 Using a DesignInstance...在 MSDN 上。

关于.net - 使用设计时的声明性数据上下文和运行时的数据模板连接 MVVM View 和 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8128421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com