如何修复WPF Datagrid中的“双向绑定需要Path或XPath”异常?

tquggr8v  于 2023-01-18  发布在  其他
关注(0)|答案(5)|浏览(570)

**此问题的背景/上下文:**我有一个WPF桌面应用程序。它使用LINQ to SQL连接到其SQL数据库,并在WPF Datagrid中显示其数据。它运行得相当好,但性能是一个问题,因为LINQ可能非常慢,所以我一直尽可能地将逻辑和UI控件从LINQ数据库上下文中切换出来,而是将它们加载到与LINQ对象非常相似的局部变量中,这大大提高了性能。
**问题:在我测试Datagrid时,当我尝试编辑一个Datagrid的某个(整数)列中的值时,虽然编辑字符串列一直工作正常,但我现在收到了一个新的异常“***双向绑定需要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小时的延迟。

ctehm74n

ctehm74n1#

我在绑定文本框时遇到了这个问题。我的解决方案是显式绑定到“”:

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

这招奏效了。

ar7v8xwq

ar7v8xwq2#

“双向绑定需要路径或XPath”错误可能是由于XAML中的路径名与c# Binding元素中的路径名有一点不同。大写字母真的很重要!这就是我的问题。
XAML:

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

C编号:

public string Totalheure { get; set; }

这将导致需要路径或XPath错误的双向绑定,因为它们并不完全相同,程序无法找到绑定路径!
也许这能帮助那些犯了同样错误的人

byqmnocz

byqmnocz3#

好吧,好吧,打完这些之后,我试了一些有效的方法。无论如何,我还是要发帖,以防对别人有帮助。
解决方案是向问题成员添加绑定的变量:

{ 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; }
rseugnpd

rseugnpd4#

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

ObservableCollection<Dependant>

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

Binding="{Binding Name_of_Dependant}"

这是错误的:

Binding="{Binding FullNames}"
sf6xfgos

sf6xfgos5#

这个错误出现的另一种方式(在我看来是错误的):我有一个DataGrid,其中ItemsSource行对象包含一个类对象X。
绑定路径类似于Binding="{Binding MyClassInstance.PropA}”
此外,网格设置为允许用户添加行。在添加行时,我忘记安排初始化MyClassInstance,因此它为空。当我从新行中删除焦点时,我将获得双向绑定需要Path或XPath异常。
当我试图修复其中一个方法时,我发现了真实的的原因,这导致我得到了空值异常。
绑定的堆栈跟踪需要一个路径错误是相当广泛的,这告诉我,开发人员一旦深入到调用,猜测最可能的原因为null值的路径问题.个人而言,对我来说,它会更有用的异常消息说:“null值遇到,检查路径或xpath已指定.”

相关问题