首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不同类型的WinUI3 XAML主视图绑定

不同类型的WinUI3 XAML主视图绑定
EN

Stack Overflow用户
提问于 2022-01-27 09:27:47
回答 1查看 350关注 0票数 1

我无法在WinUI 3中创建主视图/详细视图。

屏幕截图

我有一个treeview作为我的主列表,它有两种不同的项类型ExplorerItemTypeA和ExplorerItemTypeA,每个类都是基ExplorerItem中的一个部分类

我希望细节视图显示正确的模板为不同类型(A&B),以便我可以绑定和编辑等。

Treeview DataTemplates运行良好。以下是详细信息视图的XAML:

代码语言:javascript
运行
复制
<Page.Resources>

    <DataTemplate x:Key="ContentTypeATemplate" x:DataType="local:ExplorerItemTypeA">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="A Template"/>
            <TextBlock Text="{x:Bind Name}"/>
            </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="ContentTypeBTemplate" x:DataType="local:ExplorerItemTypeB">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="B Template"/>
            <TextBlock Text="{x:Bind Name}"/>
        </StackPanel>
    </DataTemplate>

    <ExplorerContentTemplateSelector x:Key="ExplorerContentTemplateSelector" 
                                        TreeItemTypeATemplate="{StaticResource ContentTypeATemplate}" 
                                        TreeItemTypeBTemplate="{StaticResource ContentTypeBTemplate}"/>
</Page.Resources>

如果首先尝试一个框架,但现在正在尝试一个内容演示器来查看详细信息。

代码语言:javascript
运行
复制
     <TreeView x:Name="MasterListView" 
        Grid.Column="0" 
        ItemsSource="{x:Bind ViewModel.TemplateItems}"
        SelectedItem="{x:Bind ViewModel.SelectedItem,Mode=TwoWay}"
        ItemTemplateSelector="{StaticResource ExplorerItemTemplateSelector}"/>

    <ContentPresenter
        x:Name="DetailContentPresenter"
        Grid.Column="1"
        Content="{x:Bind MasterListView.SelectedItem, Mode=OneWay}"
        ContentTemplateSelector="{StaticResource ExplorerContentTemplateSelector}" />

选举人是

代码语言:javascript
运行
复制
    public class ExplorerContentTemplateSelector : DataTemplateSelector
{
    public DataTemplate TreeItemTypeATemplate { get; set; }
    public DataTemplate TreeItemTypeBTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        var explorerItem = (ExplorerItem)item;
        switch (explorerItem.Type)
        {
            case ExplorerItem.ExplorerItemType.A:
                return TreeItemTypeATemplate;
            case ExplorerItem.ExplorerItemType.B:
                return TreeItemTypeBTemplate;
            default:
                Console.WriteLine("Default case");
                return TreeItemTypeATemplate;
        }

    }
}

我觉得答案是显而易见的和优雅的,但尽管寻找线索和方法,这位c#初学者并没有取得任何进展。我在这个简单的问题上被困的时间远远超过我愿意承认的时间。

感谢任何愿意付出时间的人。

EN

Stack Overflow用户

回答已采纳

发布于 2022-01-27 20:59:15

ContentPresenter替换为XAML标记中的ContentControl

代码语言:javascript
运行
复制
<ContentControl
    x:Name="DetailContentPresenter"
    Grid.Column="1"
    Content="{x:Bind MasterListView.SelectedItem, Mode=OneWay}"
    ContentTemplateSelector="{StaticResource ExplorerContentTemplateSelector}" />

DataTemplateSelector中,还应该覆盖接受DependencyObject参数的SelectTemplateCore重载:

代码语言:javascript
运行
复制
public class ExplorerContentTemplateSelector : DataTemplateSelector
{
    public DataTemplate TreeItemTypeATemplate { get; set; }
    public DataTemplate TreeItemTypeBTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item) =>
        SelectTemplateCore(item, null);

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        var explorerItem = item as ExplorerItem;
        switch (explorerItem?.Type)
        {
            case ExplorerItem.ExplorerItemType.A:
                return TreeItemTypeATemplate;
            case ExplorerItem.ExplorerItemType.B:
                return TreeItemTypeBTemplate;
            default:
                Console.WriteLine("Default case");
                return TreeItemTypeATemplate;
        }
    }
}
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70876142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档