如何在WPF Datagrids中修复“双向绑定需要路径或XPath”异常?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在WPF Datagrids中修复“双向绑定需要路径或XPath”异常?相关的知识,希望对你有一定的参考价值。
这个问题的背景/上下文:我有一个WPF桌面应用程序。它使用LINQ to SQL连接到其SQL数据库,并在WPF Datagrids中显示其数据。它运行得相当好,但是性能是一个问题,因为LINQ可能会非常慢,所以我一直在尽可能地将我的逻辑和UI控件从LINQ数据库上下文中切换出来,而是将它们加载到非常类似的局部变量中。 LINQ对象,大大提高了性能。
问题:当我测试我的Datagrids时,我现在得到一个新的异常“双向绑定需要Path或XPath”。当我尝试编辑一个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小时延迟后让我发布时,我会发布该修复程序。
我遇到了绑定文本框的问题。我的解决方案是明确绑定到“。”:
<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;组; }
如:
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绑定到一个名为Dependent的实体框架实体 - 字段Name_of_Dependant / Relationship / Date_of_Birth。不知何故,我决定创建新的属性:FullNames / Relationship / DateOfBirth - 所有正确的类型。 所以在我的datagrid中我绑定了一个
ObservableCollection<Dependant>
但是我的列应该绑定到实体表Dependent中的列。所以这是正确的:
Binding="{Binding Name_of_Dependant}"
这是错的:
Binding="{Binding FullNames}"
以上是关于如何在WPF Datagrids中修复“双向绑定需要路径或XPath”异常?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ViewModel 一次清除 WPF 中的所有控件?
当 SelectionMode 设置为 Cell 时,如何突出显示 WPF DataGrid 中的一行
如何在没有 REST 请求的情况下在 GUI 中基于 dojo.store.jsonrest 对 Dojo DataGrids 进行排序?