c# - UWP 从 TemplateSelector 更改为用户控件不再显示绑定
问题描述
遵循 Richard Zhang - MSFT 在我的问题UWP Treeview with Data selector generate an error in App.g.cs 中提供的工作解决方案,当我调整窗口大小时,我尝试将第二组数据模板转换为控件以获得更清晰代码并尝试解决其他一些可视化问题。代码可以编译,但没有显示任何内容。
使用 TreeView 模板选择器的工作代码:
<Page.Resources>
<DataTemplate
x:Key="ItemTemplate"
x:DataType="model:MTreeViewBase"
x:DefaultBindMode="OneWay">
<winui:TreeViewItem IsExpanded="False" ItemsSource="{x:Bind Visits}">
<controls1:TreeViewControl Data="{x:Bind}" />
</winui:TreeViewItem>
</DataTemplate>
<DataTemplate
x:Key="PAZContentTemplate"
x:DataType="model:MTreeViewPaz"
x:DefaultBindMode="OneWay">
<StackPanel>
<TextBlock Style="{StaticResource TitleTextBlockStyle}" Text="{x:Bind Name}" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Cognome" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Cognome}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Nome" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Nome}" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Telefono 1" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Telef1}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Telefono 2" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Telef2}" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Margin="{StaticResource XSmallTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Fax" />
<TextBlock
Grid.Row="3"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Fax}" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="5"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Indirizzo" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="5"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Indir}" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Cap}" />
<TextBlock
Grid.Row="2"
Grid.Column="1"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Citta}" />
<TextBlock
Grid.Row="2"
Grid.Column="2"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text=" (" />
<TextBlock
Grid.Row="2"
Grid.Column="3"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Cap}" />
<TextBlock
Grid.Row="2"
Grid.Column="4"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text=")" />
<TextBlock
Grid.Row="3"
Grid.Column="0"
Grid.ColumnSpan="5"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Nazione}" />
</Grid>
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Codice Fiscale" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.CodFis}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Nato il " />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind BornDate}" />
<TextBlock
Margin="{StaticResource XSmallTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="in" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Naton}" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Natoa}" />
<TextBlock Text=" (" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Natop}" />
<TextBlock Text=")" />
</StackPanel>
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Clinica" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Clinica}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Presentato da" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.PresDa}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Assicurazione" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Assicurazione}" />
</StackPanel>
</DataTemplate>
<DataTemplate
x:Key="APPContentTemplate"
x:DataType="model:MTreeViewVisit"
x:DefaultBindMode="OneWay">
<StackPanel>
<TextBlock
Foreground="{x:Bind ImageColor}"
Style="{StaticResource TitleTextBlockStyle}"
Text="Analisi Patologia Prossima" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Clinica" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Visit.(model:TApp.Clinica)}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Margin="{StaticResource MediumLeftTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Data" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
Margin="{StaticResource MediumLeftMargin}"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Visit.(model:TApp.DataS)}" />
</Grid>
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Descrizione" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Visit.(model:TApp.Descr)}" />
</StackPanel>
</DataTemplate>
</Page.Resources>
<templateSelectors:TreeViewDataContentTemplateSelector
x:Key="TreeViewDataContentTemplateSelector"
APPTemplate="{StaticResource APPContentTemplate}"
PAZTemplate="{StaticResource PAZContentTemplate}" />
<ScrollViewer Grid.Column="1" Padding="{StaticResource DetailPageMargin}" x:DefaultBindMode="OneWay">
<ContentControl Content="{x:Bind SelectedItem}" ContentTemplateSelector="{StaticResource TreeViewDataContentTemplateSelector}" />
</ScrollViewer>
当我单击 TreeView 中的某个项目时,面板会显示正确的信息。
但如果我试试这个:
TrewView.xaml
<ScrollViewer Grid.Column="1" Padding="{StaticResource DetailPageMargin}" >
<controls1:TreeViewContentControl Data="{x:Bind (model:MTreeViewBase)SelectedItem, Mode=OneWay}" />
</ScrollViewer>
TreeViewContentControl.xaml
<UserControl
x:Class="TitoDoc2020.Views.TreeViewContentControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TitoDoc2020.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:model="using:TitoDoc2020.Models"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<UserControl.Resources>
<DataTemplate
x:Name="PAZContentTemplate"
x:DataType="model:MTreeViewPaz"
x:DefaultBindMode="OneWay">
<StackPanel>
<TextBlock Style="{StaticResource TitleTextBlockStyle}" Text="{x:Bind Name}" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Cognome" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Cognome}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Nome" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Nome}" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Telefono 1" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Telef1}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Telefono 2" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Telef2}" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Margin="{StaticResource XSmallTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Fax" />
<TextBlock
Grid.Row="3"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Fax}" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="5"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Indirizzo" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="5"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Indir}" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Cap}" />
<TextBlock
Grid.Row="2"
Grid.Column="1"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Citta}" />
<TextBlock
Grid.Row="2"
Grid.Column="2"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text=" (" />
<TextBlock
Grid.Row="2"
Grid.Column="3"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Cap}" />
<TextBlock
Grid.Row="2"
Grid.Column="4"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text=")" />
<TextBlock
Grid.Row="3"
Grid.Column="0"
Grid.ColumnSpan="5"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Paz.Nazione}" />
</Grid>
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Codice Fiscale" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.CodFis}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Nato il " />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind BornDate}" />
<TextBlock
Margin="{StaticResource XSmallTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="in" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Naton}" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Natoa}" />
<TextBlock Text=" (" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Natop}" />
<TextBlock Text=")" />
</StackPanel>
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Clinica" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Clinica}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Presentato da" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.PresDa}" />
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Assicurazione" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Paz.Assicurazione}" />
</StackPanel>
</DataTemplate>
<DataTemplate
x:Name="APPContentTemplate"
x:DataType="model:MTreeViewVisit"
x:DefaultBindMode="OneWay">
<StackPanel>
<TextBlock
Foreground="{x:Bind ImageColor}"
Style="{StaticResource TitleTextBlockStyle}"
Text="Analisi Patologia Prossima" />
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Clinica" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Visit.(model:TApp.Clinica)}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Margin="{StaticResource MediumLeftTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Data" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
Margin="{StaticResource MediumLeftMargin}"
Style="{StaticResource DetailBodyBaseMediumStyle}"
Text="{x:Bind Visit.(model:TApp.DataS)}" />
</Grid>
<TextBlock
Margin="{StaticResource MediumTopMargin}"
Style="{StaticResource DetailSubTitleStyle}"
Text="Descrizione" />
<TextBlock Style="{StaticResource DetailBodyBaseMediumStyle}" Text="{x:Bind Visit.(model:TApp.Descr)}" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ContentControl x:Name="MainContent" />
</Grid>
</UserControl>
TreeViewContentControl.xaml.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using TitoDoc2020.Models;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
namespace TitoDoc2020.Views
{
public sealed partial class TreeViewContentControl : UserControl
{
#if LOG
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
#endif
public MTreeViewBase Data
{
get { return (MTreeViewBase)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
// Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(MTreeViewBase), typeof(TreeViewContentControl), new PropertyMetadata(null, new PropertyChangedCallback(Data_Changed)));
private static void Data_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null)
{
var instance = d as TreeViewContentControl;
if (e.NewValue is MTreeViewPaz)
{
instance.MainContent.ContentTemplate = instance.PAZContentTemplate;
}
else
{
//instance.MainContent.ContentTemplate = instance.VisitTemplate;
switch (((MTreeViewVisit)e.NewValue).Type)
{
// Generic Visits
case "APP":
instance.MainContent.ContentTemplate = instance.APPContentTemplate;
break;
default:
if (e.NewValue != null)
{
#if LOG
Logger.Error("Should never be default");
#endif
}
break;
}
}
}
}
public TreeViewContentControl()
{
this.InitializeComponent();
}
}
}
它不显示 x:Bind 中的任何内容。页面已正确更改,显示静态文本但不是真实数据。
我认为我所做的与其他控件完全相同,但无法理解我搞砸了什么
解决方案
推荐阅读
- git - 无法通过 PlugInstall 在 vim 中安装插件
- python - 切片以在熊猫数据框中使用一组点制作向量
- excel-formula - Excel公式根据数组的多个条件对数组求和——Fantasy Football
- webpack - 在 craco 中读取配置文件创建反应应用程序设置
- swift - Domain=kCLErrorDomain Code=1 "(null)" Google Maps IOS
- database - 没有数据的 StackOverflow 数据库的数据库架构
- elasticsearch - 无法解析 /etc/logstash [ELK Stack] 中的 logstash.yml 文件
- java - 如何使用飞碟制作不可编辑的pdf
- sql - 如何使用 sys.time_zone_info 检索用户定义的时区的本地时间
- java - 如何从控制器获取 1-20 个复选框的值?