我有一个窗口和一个UserControl。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>当窗口实例化UserControl时,我希望窗口的视图模型能够检索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>窗口的视图模型有一个类型为object的可公开设置的属性。对于DataContext绑定,我期望一旦创建了UserControl3,它的DataContext (它是对其视图模型的引用)的值将被分配给窗口的视图模型上的UserControl3Vm属性。
实际发生的情况是,使用空值调用Window.UserControl3Vm属性设置器。
为什么会发生这种情况,实现我心目中的目标的最佳方法是什么?
我知道,将UserControl的视图模型实例化为窗口的视图模型上的属性,并让UserControl简单地绑定到该属性上会更容易(这也会最小化视图与视图模型之间的耦合)。但在我工作的地方,他们有点疯狂,他们更喜欢先查看MVVM,而不是先查看模型,所以我在寻找最解耦的方法来使视图模型在视图模型创建时有效地结合在一起。
发布于 2013-01-10 11:31:33
这在XAML中是可能的,使用一些变通方法(对宿主元素的DataContext的访问进行黑客攻击)。该方法在here中提到。它使用Freezables。
XAML是
<Window x:Class="VM2VMBindingInXaml.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vw="clr-namespace:VM2VMBindingInXaml.View"
xmlns:vm="clr-namespace:VM2VMBindingInXaml.ViewModel"
Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
<vm:UserControl1ViewModel x:Key="childVM"></vm:UserControl1ViewModel>
<vm:DataResource x:Key="childVmBinding" BindingTarget="{Binding ElementName=child, Path=DataContext}"/>
</Window.Resources>
<Window.DataContext>
<vm:MainWindowViewModel x:Name="mainViewModel" >
<vm:MainWindowViewModel.ChildViewModel>
<vm:DataResourceBinding DataResource="{StaticResource childVmBinding}">
</vm:DataResourceBinding>
</vm:MainWindowViewModel.ChildViewModel>
</vm:MainWindowViewModel>
</Window.DataContext>
<Grid>
<vw:UserControl1 x:Name="child" DataContext="{Binding Source={StaticResource ResourceKey=childVM}}">
</vw:UserControl1>
</Grid>
</Window>https://stackoverflow.com/questions/14238259
复制相似问题