Обратите внимание, что в 1809 году с 17763 SDK вы действительно могли использовать NavigationViewItem в шаблоне данных. Однако в более старых версиях NavigationViewItem допускается только в свойстве MenuItems представления Navigation (но не в MenuItemTemplate).
ался использоватьNavigationView
потому что это выглядит очень полезным, но я изо всех сил пытаюсь заставить его работать с шаблоном MVVM.
Я прикрепил свойство MenuItemsSource, как в следующем фрагменте:
<Page x:Class="App5.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App5"
...>
<Page.DataContext>
<local:MainViewModel></local:MainViewModel>
</Page.DataContext>
<NavigationView MenuItemsSource="{Binding Items}">
<NavigationView.MenuItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</NavigationView.MenuItemTemplate>
</NavigationView>
</Page>
Все, что я получаю, это:
Это круто, ноNavigationViewItem
имеетIcon
свойство украсить текст им.
Как установить значок в зависимости от элемента, привязанного к каждомуNavigationViewItem
?
ВНИМАНИЕ: Я действительно не хочу вручную добавлять значок как частьMenuItemTemplate
потому что это не так, как должно быть. Что мне нужно, это привязать свойство Icon неявно сгенерированногоNavigationViewItems
.
Вопрос в том, как?
Я пытался с этим (используяMenuItemContainerStyle
), но это не работает:
<NavigationView MenuItemsSource="{Binding Items}">
<NavigationView.MenuItemContainerStyle>
<Style TargetType="NavigationViewItem">
<Setter Property="Icon" Value="{Binding Converter={StaticResource ItemToIconConverter}}" />
</Style>
</NavigationView.MenuItemContainerStyle>
<NavigationView.MenuItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</NavigationView.MenuItemTemplate>
</NavigationView>
НОТА: С предложенным XAML в ответе ниже (NavigationViewItem
внутриDataTemplate
),NavigationViewItem
дублируется в визуальном дереве (одно вложено в другое):
Это не решение. Более того, выглядит и ведет себя плохо. Посмотрите на этот снимок предлагаемого решения: