UWP绑定错误:DataTemplate类型未找到Fletes属性,绑定路径无效
Invalid binding path 'Fletes' : Property 'Fletes' not found on type 'DataTemplate' 我看了你的代码,问题核心出在XAML控件结构和绑定上下文的混淆上——你完全搞错了MasterDetailsView的用法,这才导致绑定找不到正确的数据源。
问题根源
你把ListView嵌套进了MasterDetailsView.ItemTemplate里,但MasterDetailsView本身就是一个自带列表+详情展示的控件,它的ItemTemplate是用来定义单个列表项的UI模板的,不是用来嵌套另一个列表控件的。
当你在DataTemplate内部使用{x:Bind ViewModel.Fletes}时,绑定上下文已经变成了DataTemplate对应的数据项(而你根本没给MasterDetailsView设置ItemsSource,上下文甚至直接是DataTemplate本身),自然找不到页面的ViewModel.Fletes属性,就抛出了那个错误。
修正步骤
我们需要调整XAML结构,让MasterDetailsView直接绑定你的Fletes集合,再用ItemTemplate定义单个Flete的展示模板:
1. 修正HomeFletes.xaml的核心结构
移除嵌套的ListView,给MasterDetailsView直接设置ItemsSource,并正确定义单条数据的模板:
<Page x:Class="Internal.Views.HomeFletes" xmlns:local="using:Internal" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:model="using:Internal.Models" xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <!-- 直接给MasterDetailsView绑定页面的ViewModel.Fletes集合 --> <controls:MasterDetailsView Loaded="MasterDetailsView_Loaded" CompactModeThresholdWidth="720" ItemsSource="{x:Bind ViewModel.Fletes}"> <!-- ItemTemplate用来定义单个Flete项的UI --> <controls:MasterDetailsView.ItemTemplate> <DataTemplate x:DataType="model:Flete"> <RelativePanel Margin="24"> <StackPanel Height="100" Width="100" Background="OrangeRed"> <TextBlock Text="{x:Bind Transporte}"/> <TextBlock Text="{x:Bind Comentario}" x:Phase="2"/> </StackPanel> </RelativePanel> </DataTemplate> </controls:MasterDetailsView.ItemTemplate> <!-- 可选:添加详情面板,选中项后展示完整信息 --> <controls:MasterDetailsView.DetailsTemplate> <DataTemplate x:DataType="model:Flete"> <StackPanel Margin="24"> <TextBlock Text="详情信息" FontSize="24" FontWeight="Bold"/> <TextBlock Text="{x:Bind Transporte}" Margin="0,12,0,0" FontSize="18"/> <TextBlock Text="{x:Bind Fecha, StringFormat='yyyy-MM-dd HH:mm'}" Margin="0,6,0,0"/> <TextBlock Text="{x:Bind Comentario}" Margin="0,6,0,0"/> </StackPanel> </DataTemplate> </controls:MasterDetailsView.DetailsTemplate> </controls:MasterDetailsView> </Page>
2. 确认ViewModel的绑定有效性
你的页面代码已经正确初始化了ViewModel属性,{x:Bind ViewModel.Fletes}是编译时绑定,会直接关联页面实例的ViewModel属性,这部分没问题。如果后续需要动态更新集合,你已经用了ObservableCollection,且ViewModel继承了BindableBase,这也符合UWP的MVVM规范。
3. 额外优化:完善Flete类的属性通知
你的Flete类实现了INotifyPropertyChanged,但属性的setter没有触发OnPropertyChanged,如果后续需要更新单个Flete的属性值,记得修改:
private string _transporte; public string Transporte { get => _transporte; set { _transporte = value; OnPropertyChanged(); } } // Fecha和Comentario属性同理修改
为什么之前的尝试没用?
- 你用
{Binding Viewmodel.Fletes}时,页面代码里并没有设置this.DataContext = ViewModel;(你只初始化了属性),所以Binding找不到数据源;而x:Bind是编译时绑定,直接找页面的属性,但之前因为结构错误导致上下文不对。 - 移除
x:DataType只是跳过了编译时检查,并没有解决结构错误的核心问题。
调整后,MasterDetailsView会正常展示Fletes集合里的所有项,选中项后还能在详情面板看到完整信息。
内容的提问来源于stack exchange,提问作者Mumela

