我对尝试在 UWP 应用程序中实现相同的视觉行为感到非常沮丧。这是我的问题:
我正在使用 NavigationView,并且想从 ViewModel 提供 NavigationViewItem。我还想提供标头,因此我创建一个 ICollectionDataItem 接口并为 NavigationViewItem 和 NavigationViewItemHeader 实现 ViewModel,以便主视图模型向 NavigationView 提供 ICollectionDataItem 列表,并由 DataTemplateSelector 发挥作用。现在看起来是这样的:
<NavigationView
MenuItemsSource="{Binding Home.CollectionsView, Source={StaticResource Locator}}"
MenuItemTemplateSelector="{StaticResource NavigationViewTemplateSelector}" />
public interface ICollectionDataItem
{
string Title { get; set; }
string Glyph { get; set; }
bool IsVisible { get; set; }
bool IsHeader { get; set; }
}
然后,我为 NavigationViewItem 创建一个 DataTemplate,并为 NavigationViewItemHeader 创建另一个 DataTemplate:
<DataTemplate x:Key="NavigationItemTemplate" x:DataType="models:ICollectionDataItem">
<NavigationViewItem> <!--Bindings-->
</NavigationViewItem>
</DataTemplate>
<DataTemplate x:Key="NavigationHeaderTemplate" x:DataType="models:ICollectionDataItem">
<NavigationViewItemHeader> <!--Bindings-->
</NavigationViewItemHeader>
</DataTemplate>
当然,现在是 DataTemplateSelector:
public DataTemplate NavItemTemplate { get; set; }
public DataTemplate NavItemHeaderTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item)
{
ICollectionDataItem data = (ICollectionDataItem)item;
return (data.IsHeader) ? NavItemHeaderTemplate : NavItemTemplate;
}
这工作得很好......直到它不起作用。 Windows 10 SDK 1809 中的 NavigationViewItem 的默认样式与 1803 中的完全不同。虽然在第一个 SDK 中一切正常,但在第二个 SDK 中它不会将 NavigationHeaderTemplate 识别为 NavigationViewItemHeader,而是显示一个带有 NavigationViewItemHeader 作为内容的 NavigationViewItem这是完全可以选择的。
我可以想象如何解决 NavigationViewItem(s) 的问题,我可以检查 Windows 版本,我可以为不同版本设置不同的模板,但我的问题是:
如何向 NavigationView 提供 ICollectionDataItem 列表,然后使用 xaml 将其转换为 NavigationViewItem(s) 和 NavigationViewItemHeader(s),并保证在 Windows 10 1803 和 1809 中具有相同的行为(我不假装使用以前的版本) ?
也许你认为答案是显而易见的,亲自尝试一下你就会知道。
我对这个问题感到非常沮丧;任何帮助将不胜感激。
提前致谢