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

Dro*_*onz 13 data-binding wpf wpfdatagrid 2-way-object-databinding

这个问题的背景/上下文: 我有一个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">
Run Code Online (Sandbox Code Playgroud)

...

<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>
Run Code Online (Sandbox Code Playgroud)

这是由代码绑定:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;
Run Code Online (Sandbox Code Playgroud)

其定义为:

public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>();
Run Code Online (Sandbox Code Playgroud)

其约束成员是:

    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;
Run Code Online (Sandbox Code Playgroud)

我在键入此内容后不久发现了一个非常简单的修复程序,当网站在8小时延迟后让我发布时,我会发布该修复程序.

Lyn*_*ing 18

我遇到了绑定文本框的问题.我的解决方案是明确绑定到".":

<TextBox Text="{Binding Path=.}" />
Run Code Online (Sandbox Code Playgroud)

这就是诀窍.


Mr *_*bix 5

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

XAML:

<DataGridTextColumn Binding="{Binding Path=TotalHeure}"   ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/>
Run Code Online (Sandbox Code Playgroud)

C#:

public string Totalheure { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将导致双向绑定,要求Path或XPath错误,因为它们并不完全相同,并且程序无法找到绑定路径!

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


Dro*_*onz 2

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

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

 { get; set; }
Run Code Online (Sandbox Code Playgroud)

如:

    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; }
Run Code Online (Sandbox Code Playgroud)

  • 如果这对您来说很神秘,那是因为您无法绑定到字段,只能绑定到属性。有关原因的解释,请参阅:http://stackoverflow.com/questions/842575/why-does-wpf-support-binding-to-properties-of-an-object-but-not-fields (4认同)