【发布时间】:2020-06-10 23:31:34
【问题描述】:
我在 MVVM WPF 应用程序中使用 Hamburger Menu,并使用 DataTemplate 将 Badge 控件应用于每个菜单项,如下所示:(取自 https://github.com/MahApps/MahApps.Metro/issues/3800)。
`<DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type Controls:HamburgerMenuIconItem}">
<Grid Height="48">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="48" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Controls:Badged Grid.Column="0"
Badge="{Binding DataContext.TestCount, RelativeSource={RelativeSource AncestorType=UserControl}}"
BadgeBackground="Red"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ContentControl Content="{Binding Icon}"
Margin="2"
Focusable="False"
IsTabStop="False" />
</Controls:Badged>
<TextBlock Grid.Column="1"
VerticalAlignment="Center"
FontSize="16"
Text="{Binding Label}" />
</Grid>
</DataTemplate>`
这很好用,但是这会将相同的值应用于所有菜单项 - 在此示例中,我绑定到来自 MessagingMainViewModel 的名为 TestCount 的属性(包含 HamburgerMenu 控件标记的视图的视图模型)。
`<Controls:HamburgerMenu x:Name="HamburgerMenuControl"
HamburgerWidth="48"
IsPaneOpen="True"
CanResizeOpenPane="True"
ItemInvoked="HamburgerMenuControl_OnItemInvoked"
ItemTemplate="{StaticResource MenuItemTemplate}"
OptionsItemTemplate="{StaticResource MenuItemTemplate}"
SelectedIndex="0"
Style="{StaticResource MahApps.Styles.HamburgerMenu.Ripple}"
VerticalScrollBarOnLeftSide="False">
<!-- Items -->
<Controls:HamburgerMenu.ItemsSource>
<Controls:HamburgerMenuItemCollection>
<Controls:HamburgerMenuIconItem Icon="{iconPacks:FontAwesome Kind=CommentAltSolid}" Label="Chat">
<Controls:HamburgerMenuIconItem.Tag>
<views:ChatView />
</Controls:HamburgerMenuIconItem.Tag>
</Controls:HamburgerMenuIconItem>
<Controls:HamburgerMenuIconItem Icon="{iconPacks:FontAwesome Kind=PenSquareSolid}" Label="Compose">
<Controls:HamburgerMenuIconItem.Tag>
<views:ComposeMessageView />
</Controls:HamburgerMenuIconItem.Tag>
</Controls:HamburgerMenuIconItem>
<Controls:HamburgerMenuIconItem Icon="{iconPacks:Material Kind=InboxArrowDown}" Label="Inbox">
<Controls:HamburgerMenuIconItem.Tag>
<views:InboxView />
</Controls:HamburgerMenuIconItem.Tag>
</Controls:HamburgerMenuIconItem>
</Controls:HamburgerMenuItemCollection>
</Controls:HamburgerMenu.ItemsSource>
...`
每个菜单项都是一个视图,具有自己的视图模型,我想绑定到 ChatViewModel 和 InboxViewModel(但不是 ComposeViewModel)的公开属性,例如,名为 UnreadCount。我在 MessagingMainViewModel 中没有子视图模型的实例(因为到目前为止在应用程序中没有必要)。
我知道如何绑定到 MessagingMainViewModel 上的属性(如上面的 DataTemplate 代码所示),但找不到访问“子”视图的视图模型的方法 - 没关系以某种方式在 DataTemplate 中使用它。这可能吗?谢谢。
【问题讨论】:
标签: c# wpf data-binding mahapps.metro