我有一個窗口和一個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的viewmodel有一個可公開設置的object類型屬性。通過DataContext綁定,我期望在創建UserControl3後,其DataContext(它是對其視圖模型的引用)的值將被分配給Window的viewmodel上的UserControl3Vm屬性。
實際發生的事情是Window.UserControl3Vm屬性設置器被調用的值爲null。
爲什麼會發生這種情況,實現我的想法的最佳方法是什麼?
我知道將UserControl的視圖模型實例化爲Window視圖模型的一個屬性並讓UserControl簡單地綁定到該視圖上(並且這也將視圖與視圖模型的耦合最小化) 。但是在我工作的地方,他們有點瘋狂,我更喜歡首先查看第一個MVVM,而不是第一個查看模型,所以我正在尋找最分離的方式,以便在視圖模型由其視圖創建時使視圖模型有效地進行協作。
這是一些討厭的耦合對那裏發生的。 UserControl視圖必須知道託管它的視圖使用的視圖模型的具體類型。如果UserControl由各種不同的視圖託管會怎麼樣?然後,它需要調用其擁有的視圖的類型,以便能夠將其視圖模型引用分配給其擁有者的視圖模型。 – Neutrino
@Neutrino Loaded事件應該放在'Window'後面的代碼中,而不是'UserControl',所以它只需要引用它自己的ViewModel的數據類型。我會更新代碼示例以使其更易於查看。 – Rachel
對不起,我一直在昏暗。是的,這工作得很好。我甚至不需要使用Loaded事件,我可以在窗口構造函數中調用InitializeComponent之後立即執行此操作。 – Neutrino