我試圖在我已經在使用嵌套視圖的工作應用程序中創建嵌套的ViewModels。下面是我想要做的一個例子:MVVM將嵌套的子視圖掛接到子視圖模型
主窗口視圖:
<Window x:Name="FCTWindow" x:Class="CatalogInterface.MainWindow"
xmlns:local="clr-namespace:CatalogInterface"
xmlns:vm="clr-namespace:CatalogInterface.ViewModels"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="532">
<Window.Resources>
<vm:MainWindowViewModel x:Key="ViewModel" />
</Window.Resources>
<Grid DataContext="{Binding Path=ViewModel.DirFilesListBoxViewModel}" x:Name="BodyGridLeft" Grid.Row="0" Grid.Column="0">
<local:ctlDirFilesListBox>
<!--
Need to access the `ItemsSource="{Binding }"` and
`SelectedItem="{Binding Path=}"` of the ListBox in
`ctlDirFilesListBox` view -->
</local:ctlDirFilesListBox>
</Window>
子視圖:
<UserControl x:Class="CatalogInterface.ctlDirFilesListBox"
xmlns:local="clr-namespace:CatalogInterface"
xmlns:vm="clr-namespace:CatalogInterface.ViewModels"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="MainControlGrid">
<ListBox SelectionChanged="ListBoxItem_SelectionChanged"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FFFFFF"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" BorderThickness="0">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>
<EventSetter Event="KeyDown" Handler="ListBoxItem_KeyDown"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
</UserControl>
MainWindowViewModel
using System;
using System.Text;
namespace CatalogInterface.ViewModels
{
class MainWindowViewModel
{
public DirFilesViewModel DirFilesViewModel { get; set; }
public MainWindowViewModel()
{
DirFilesViewModel = new DirFilesViewModel();
}
}
}
所以,我需要掛接ListBox.SelectedItem
和ListBox.ItemSource
與MainWindowViewModel.DirFilesViewModel
中的屬性綁定。趕上是我在MainWindow View
不是ctlDirListBox
查看綁定。
如何訪問我的子視圖中的元素?我認爲這是我最大的障礙。我認爲我所有的數據上下文都是正確的,我只是無法纏繞子視圖元素。
UserControls應該爲您的模型或您的視圖模型設計。你不應該爲你的UserControl設計一個視圖模型。 TextBox是否有TextBoxViewModel? **不,**,並有一個很好的理由。對於這種反模式的真實生活中的例子,以及爲什麼它不能很好地閱讀[這個答案](https://stackoverflow.com/a/44729258/1228)。 – Will