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

Posted

技术标签:

【中文标题】如何修复 WPF Datagrids 中的“双向绑定需要路径或 XPath”异常?【英文标题】:How do I fix "Two-way binding requires Path or XPath" exception in WPF Datagrids? 【发布时间】:2012-03-16 00:30:22 【问题描述】:

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

问题: 当我测试我的 Datagrids 时,当我尝试编辑某个(整数) 一个 Datagrid 的列,尽管编辑字符串列一直工作正常。我不明白我为什么会得到这个,或者该怎么做。

因此,当 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 小时后允许我发布时,我将发布该修复程序。

【问题讨论】:

【参考方案1】:

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

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

成功了。

【讨论】:

【参考方案2】:

“双向绑定需要路径或 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 错误的双向绑定,因为它们不完全相同并且程序无法找到绑定路径!

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

【讨论】:

【参考方案3】:

好的,输入所有内容后,我尝试了一些可行的方法。无论如何我都会发帖,以防它帮助其他人。

解决方法是在问题中添加绑定的成员变量:

得到;放;

如:

    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; 

【讨论】:

如果这对你来说很神秘,那是因为你不能绑定到字段,只能绑定到属性。有关原因的解释,请参阅:***.com/questions/842575/… @MatrixManAtYrService 谢谢,虽然在阅读之后,它对我来说仍然很神秘。显然我需要阅读字段和属性的定义和区别。 嘿。好的,稍微阅读一下,我发现我一直在使用字段和属性,但不知道 C# 是如何称呼它们的。很有趣,谢谢。【参考方案4】:

当您在一天结束时感到疲倦时,有时会做一些奇怪的小事。 我有一个 Datagrid 绑定到一个名为 Dependent 的实体框架实体 - 字段 Name_of_Dependant/Relationship/Date_of_Birth。 不知何故,我决定创建新属性:FullNames / Relationship / DateOfBirth - 所有正确的类型。 所以在我的数据网格中我绑定到一个

ObservableCollection<Dependant> 

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

Binding="Binding Name_of_Dependant"

这是错误的:

Binding="Binding FullNames"

【讨论】:

以上是关于如何修复 WPF Datagrids 中的“双向绑定需要路径或 XPath”异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ViewModel 一次清除 WPF 中的所有控件?

当 SelectionMode 设置为 Cell 时,如何突出显示 WPF DataGrid 中的一行

WPF DataGrid 同步列宽

js 一对多 双向绑定器

尝试 javascript 一对多 双向绑定器

如何删除所有DataGrids的选择?