如何在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 进行排序?

如何删除所有DataGrids的选择?

vue组件双向绑定.sync修饰符的一个坑

WPF DataGrid 同步列宽