【问题标题】:UWP TabView ItemTemplateSelector not workingUWP TabView ItemTemplateSelector 不工作
【发布时间】:2020-01-23 20:37:55
【问题描述】:

我有一个带有 Pivot 控件的 UWP 页面,其中 ItemTemplateSelector 绑定到 DataTemplateSelector 派生类。代码按预期工作,这里是 XAML sn-p

<Pivot IsHeaderItemsCarouselEnabled="False" 
ItemsSource ="{x:Bind MainPageViewModel.EditViewModels}"  
ItemTemplateSelector="{StaticResource DetailViewTemplateSelector}"  >
<Pivot.HeaderTemplate>
<DataTemplate >
<TextBlock Text="New Item"/>
</DataTemplate>
</Pivot.HeaderTemplate>
</Pivot>

我有一个资源字典,其中数据模板定义为:

<DataTemplate x:Key="Tabela_DetailViewModel" >
<detailView:Tabela_View />
</DataTemplate>   

代码按预期工作。当我将对象添加到 itemsource 时,会创建新的数据透视项目,并使用用户控件 Tabela_View 呈现它们的内容。

我将 Pivot 控件从 Microsoft.Toolkit.Uwp.UI.Controls 命名空间更改为 TabView。更改控件后,当我打开一个新选项卡时,将呈现类型名称而不是用户控件视图。 这是 TabView 的 XAML:

<muxc:TabView x:Name="Tabs" Grid.Column="1" Grid.Row="0"   
ItemsSource ="{x:Bind MainPageViewModel.EditViewModels}"          
SelectedItem="{x:Bind MainPageViewModel.SelectedEntityViewModel,Mode=TwoWay}"
ItemTemplateSelector="{StaticResource DetailViewTemplateSelector}"    >
<muxc:TabView.ItemHeaderTemplate>
<DataTemplate >
<TextBlock Text="New Item"/>
</DataTemplate>
</muxc:TabView.ItemHeaderTemplate>
</muxc:TabView>

这是模拟此错误的项目project link 的链接。请注意,注释的枢轴控件 sn-p 按预期工作

任何帮助将不胜感激。 问候, 赛菲

【问题讨论】:

    标签: uwp windows-community-toolkit


    【解决方案1】:

    UWP TabView ItemTemplateSelector 不工作

    我已经测试过ItemTemplateSelector,在我这边运行良好,请参考以下代码检查是否遗漏了一些关键程序。

    制作数据模型

    public class TabItem
    {
        public ItemType Type { get; set; }
        public string Header { get; set; }
        public Microsoft.UI.Xaml.Controls.IconSource Icon { get; set; }
    }
    public enum ItemType { TypeA, TypeB };
    

    使TabViewItemTemplateSelector 类继承DataTemplateSelector

    public class TabViewItemTemplateSelector : DataTemplateSelector
    {
        public DataTemplate TemplateOne { get; set; }
        public DataTemplate TemplateTwo { get; set; }
    
        protected override DataTemplate SelectTemplateCore(object item)
        {
            var tabItem = (TabItem)item;
            return tabItem.Type == ItemType.TypeA ? TemplateOne : TemplateTwo;
        }
    }
    

    Xaml 代码

    <Page.Resources>
        <local:TabViewItemTemplateSelector
            x:Key="TabViewItemTemplateselector"
            TemplateOne="{StaticResource Templateone}"
            TemplateTwo="{StaticResource Templatetwo}"
            />
        <DataTemplate x:Key="Templateone" x:DataType="local:TabItem">
            <muxc:TabViewItem Header="{x:Bind Header}" IconSource="{x:Bind Icon}" >
                <detailview:Tabela_View/>
            </muxc:TabViewItem>
        </DataTemplate>
        <DataTemplate x:Key="Templatetwo" x:DataType="local:TabItem" >
            <muxc:TabViewItem Header="{x:Bind Header}" IconSource="{x:Bind Icon}" >
                <detailview:NormalPage/>
            </muxc:TabViewItem>
        </DataTemplate>
    </Page.Resources>
    

    用法

    <muxc:TabView
        x:Name="MyTabView"
        Grid.Row="0"
        Grid.Column="1"
        TabItemTemplateSelector="{StaticResource TabViewItemTemplateselector}"
        />
    
    
    MyTabView.TabItemsSource = new List<TabItem>() {
        new TabItem(){ Header="One", Icon = new Microsoft.UI.Xaml.Controls.SymbolIconSource(){ Symbol= Symbol.DockBottom},Type=ItemType.TypeA },
         new TabItem(){ Header="Two",  Icon = new Microsoft.UI.Xaml.Controls.SymbolIconSource(){ Symbol= Symbol.Document},Type=ItemType.TypeB },
          new TabItem(){ Header="Three",  Icon = new Microsoft.UI.Xaml.Controls.SymbolIconSource(){ Symbol= Symbol.Accept},Type=ItemType.TypeA }
    };
    

    【讨论】:

    • 感谢您的回复。如果您可以检查我在原始帖子中附加的示例的扭结,我将不胜感激。在我的解决方案中,我按照您在回答中的建议做了。不同之处在于我使用了一个合并的资源字典,它定义了模板选择器应该使用的数据模板。在模板选择器中,我根据视图模型类型从资源中检索模板。在示例中,您可以看到相同的代码如何与 Pivot 而不是 Tabs 一起使用。如果您可以查看示例中的代码并了解您是否能弄清楚发生了什么,我将不胜感激
    • 还有一点,我无法在资源字典中使用 x:DataType。它会生成编译错误 [XAML 二进制格式 (XBF) 生成器报告语法错误“0x09C4”]。请注意,缺少 x:DataType 对 Pivot 控件来说不是问题
    • 您可以删除 x:DataType 并使用绑定方案。
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2020-01-23
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多