You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP绑定错误:DataTemplate类型未找到Fletes属性,绑定路径无效

解决UWP ListView绑定错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:57:32