如何修复“;双向绑定需要Path或XPath“;WPF数据网格中出现异常

本文关键字:数据网 数据 WPF 网格 异常 XPath Path 何修复 绑定 | 更新日期: 2023-09-27 18:25:53

此问题的背景/上下文:我有一个WPF桌面应用程序。它使用LINQ to SQL连接到其SQL数据库,并在WPF数据网格中显示其数据。它运行得相当好,但性能是个问题,因为LINQ可能非常慢,所以我一直在尽可能地将逻辑和UI控件从LINQ数据库上下文中切换出来,而是将它们加载到与LINQ对象非常相似的局部变量中,这大大提高了性能。

问题:当我测试我的数据网格时,当我试图编辑一个数据网格的某个(整数)列中的值时,我现在得到了一个新的异常"双向绑定需要Path或XPath。",尽管编辑字符串列一直很好。我不明白我为什么会得到这个,或者该怎么办。

因此,当datagrid.datacontext被设置为LINQ实体关联时,它就起作用了,但只有当它被设置为普通对象列表时,它才几乎起作用。我尝试将列表更改为ObservableCollection,但没有明显效果。

我在这里和其他网站上查看了大约十几个不同的相关问题,但没有看到任何帮助。

目前我有:

<DataGrid Margin="12,110,12,0" x:Name="dgDays" ItemsSource="{Binding}" 
                 Height="165" VerticalAlignment="Top" MinHeight="0" 
                 AutoGenerateColumns="False"
                 SelectionChanged="dgDays_SelectionChanged">

<DataGrid.Columns>
            <DataGridComboBoxColumn Width="80" Header="Cook" x:Name="_DailyCookCombo" SelectedItemBinding="{Binding sCook}"/>
            <DataGridComboBoxColumn Width="80" Header="Eat" x:Name="_DailyDayCombo" SelectedItemBinding="{Binding sDay}"/>
            <DataGridTextColumn Width="52" Header="Prot" Binding="{Binding Protein}" />
            <DataGridTextColumn Width="52" Header="Carb" Binding="{Binding Carb}" />
            <DataGridTextColumn Width="52" Header="Fat" Binding="{Binding Fat}" />
            <DataGridTextColumn Width="62" Header="Prot %" Binding="{Binding ProteinPercent}" />
            <DataGridTextColumn Width="62" Header="Carb %" Binding="{Binding CarbPercent}" />
            <DataGridTextColumn Width="62" Header="Fat %" Binding="{Binding FatPercent}" />
            <DataGridTextColumn Width="116" Header="non PFW meals" Binding="{Binding NonPFWMeals}" />
            <DataGridTextColumn Width="55" Header="Prot" Binding="{Binding CalcProt}" IsReadOnly="True" />
            <DataGridTextColumn Width="55" Header="Carb" Binding="{Binding CalcCarbs}" IsReadOnly="True" />
            <DataGridTextColumn Width="55" Header="Fat" Binding="{Binding CalcFat}" IsReadOnly="True" />
            <DataGridTextColumn Width="65" Header="KCal" Binding="{Binding CalcKCal}" IsReadOnly="True" />
            <DataGridCheckBoxColumn Width="32" Header="Skip" Binding="{Binding Skip}"  />
            <DataGridTextColumn Width="70" Header="Date" Binding="{Binding sNextDate}" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>

受代码约束:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;

其定义为:

public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>();

其绑定成员为:

    public class RAM_Member_Requirements_Day : INotifyPropertyChanged
{
    // RAM equivalents of DB values:
public System.Nullable<decimal> Protein;
public System.Nullable<decimal> Carb;
public System.Nullable<decimal> Fat;
public System.Nullable<decimal> ProteinPercent;
public System.Nullable<decimal> CarbPercent;
public System.Nullable<decimal> FatPercent;
public System.Nullable<int> NonPFWMeals;
public System.Nullable<bool> Skip;
public System.Nullable<System.DateTime> SkipDate;

我在输入这篇文章后不久就找到了一个非常简单的修复方法,我会在网站延迟8小时后允许我发布。

如何修复“;双向绑定需要Path或XPath“;WPF数据网格中出现异常

我在绑定文本框时遇到了这个问题。我的解决方案是明确绑定到".":

<TextBox Text="{Binding Path=.}" />

成功了。

"双向绑定需要Path或XPath"错误可能是由XAML中的路径名称与c#binding元素中的路径的名称稍有不同引起的。大写字母真的很重要!那是我的问题。

XAML:

<DataGridTextColumn Binding="{Binding Path=TotalHeure}"   ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/>

C#:

public string Totalheure { get; set; }

这将导致双向绑定需要Path或XPath错误,因为它们不完全相同,并且程序无法找到绑定路径!

也许它会帮助其他犯同样错误的人

好吧,在输入了所有这些之后,我尝试了一些有效的方法。无论如何,我都会发帖,以防对他人有所帮助。

解决方案是将绑定的成员变量添加到问题中:

 { get; set; }

如:

    public System.Nullable<decimal> Protein { get; set; }
    public System.Nullable<decimal> Carb { get; set; }
    public System.Nullable<decimal> Fat { get; set; }
    public System.Nullable<decimal> ProteinPercent { get; set; }
    public System.Nullable<decimal> CarbPercent { get; set; }
    public System.Nullable<decimal> FatPercent { get; set; }
    public System.Nullable<int> NonPFWMeals { get; set; }
    public System.Nullable<bool> Skip { get; set; }

出现此错误的另一种方式(在我看来是错误的)。我有一个DataGrid,其中ItemsSource行对象包含一个类对象X

绑定路径看起来像binding="0";{Binding MyClassInstance.PropA}";

此外,网格设置为允许用户添加行。我在添加行时忘记了安排初始化MyClassInstance,因此它为null。当我从新行中移除焦点时,我会得到双向绑定requires Path或XPath异常。

当我试图修复其中一个方法时,发现了导致我获得null值异常的真正原因。

绑定的堆栈跟踪需要一个路径错误非常广泛,这告诉我,开发人员一旦深入调用,就猜测空值最可能的原因是路径问题。就我个人而言,如果例外的信息说";遇到null值,请检查是否指定了路径或xpath"

当你在一天结束时感到疲惫时,有时会做一些奇怪的小事。我有一个数据网格绑定到一个名为Dependent-fields Name_of_Dependent/Relationship/Date_of_Birth的实体框架实体。不知怎么的,我决定创建新的属性:全名/关系/出生日期-所有正确的类型
所以在我的数据网格中,我绑定到

ObservableCollection<Dependant> 

但是我的列应该绑定到实体表Dependent中的列。所以这是正确的:

Binding="{Binding Name_of_Dependant}"

这是错误的:

Binding="{Binding FullNames}"