我有一个窗口和一个用户控件。UserControl 创建自己的视图模型,如下所示:
<UserControl x:Class="UiInteraction.UserControl3"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:UiInteraction"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<local:UserControl3Vm/>
</UserControl.DataContext>
<StackPanel>
<TextBlock Text="{Binding String1}"/>
</StackPanel>
</UserControl>
当窗口实例化用户控件时,我希望窗口的视图模型能够检索用户控件的视图模型。
<Window x:Class="UiInteraction.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:UiInteraction"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainWindowVm/>
</Window.DataContext>
<StackPanel>
<local:UserControl3 DataContext="{Binding UserControl3Vm, Mode=OneWayToSource}"/>
</StackPanel>
</Window>
Window 的视图模型具有对象类型的可公开设置的属性。通过 DataContext 绑定,我期望一旦创建 UserControl3,其 DataContext 的值(这是对其视图模型的引用)将被分配给窗口视图模型上的 UserControl3Vm 属性。
实际发生的是 Window.UserControl3Vm 属性设置器以 null 值调用。
为什么会发生这种情况,实现我的想法的最佳方法是什么?
我知道将 UserControl 的 viewmodel 实例化为 Window 的 viewmodel 上的属性并让 UserControl 简单地绑定到它会更容易,(这也可以最大限度地减少视图与其视图模型的耦合)。但是在我工作的地方,它们有点疯狂,并且更喜欢先查看 MVVM 而不是先查看视图模型,所以我正在寻找最解耦的方法,以使视图模型在视图模型由它们的视图创建时有效地协作。