作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我已经使用嵌套 View 的应用程序中建立嵌套 View 模型。这是我想做的一个例子:
主窗口 View :
<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>
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
中的属性绑定(bind).问题是我必须在
MainWindow View
中进行绑定(bind)不是
ctlDirListBox
看法。
最佳答案
我假设 DirFilesViewModel
是该用户控件的 View 模型。如果不是这样,请告诉我真实情况,我们会解决的。
这是一个非常简单的案例。 @JamieMarshall 如果您提供的 XAML 是您的用户控件的全部内容,那么它可能根本不应该是用户控件。您可以只编写一个包含该 XAML 的 DataTemplate 并使用它,或者您可以为 ListBox 编写一个样式。如果您需要这些事件,那么 UserControl 是有意义的,但您可能实际上并不需要这些事件。
但这可能只是了解如何使用 UserControls 的一个最小示例,为此它非常适合。
您可以在窗口的构造函数中将主视图模型的实例分配给主窗口的 DataContext,
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
<Window.DataContext>
<vm:MainWindowViewModel />
<Window.DataContext>
<Grid
DataContext="{Binding Source={StaticResource ViewModel}}"
>
<!-- No x:Key, just DataType: It'll be implicitly used for that type. -->
<DataTemplate DataType="{x:Type vm:DirFilesViewModel>
<local:ctlDirFilesListBox />
</DataTemplate>
<UserControl
Grid.Row="0"
Grid.Column="0"
Content="{Binding DirFilesViewModel}"
/>
DirFilesViewModel
的属性。 .它发现有一个对象是该类的实例,也名为
DirFilesViewModel
.它知道它有该类的 DataTemplate,因此它使用该数据模板。
ObservableCollection<ViewModelBase>
具有十种不同 View 模型的三十个实例和不同的 View ,并且用户选择一个或另一个。所选 View 模型位于名为
SelectedChildVM
的 mainviewmodel 属性中。 .这是使用正确 View 显示 SelectedChildVM 的 XAML:
<ContentControl Content="{Binding SelectedChildVM}" />
<!--
Need to access the `ItemsSource="{Binding }"` and
`SelectedItem="{Binding Path=}"` of the ListBox in
`ctlDirFilesListBox` view -->
DirFilesViewModel
)有一个
Files
属性 (
ObservableCollection<SomeFileClass>
) 和
SelectedFile
类(
SomeFileClass
)。您可能不需要
ListBoxItem_SelectionChanged
.
<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
ItemsSource="{Binding Files}"
SelectedItem="{Binding SelectedFile}"
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>
关于c# - MVVM 将嵌套 subview 连接到 subview 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46597056/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!