如何修复 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 中的所有控件?