21

这个问题的背景/上下文: 我有一个 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 小时后允许我发布时,我将发布该修复程序。

4

4 回答 4

42

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

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

那成功了。

于 2017-04-27T15:36:52.850 回答
8

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

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

于 2016-02-01T20:39:20.153 回答
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; }
于 2012-02-26T16:58:13.103 回答
1

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

ObservableCollection<Dependant> 

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

Binding="{Binding Name_of_Dependant}"

这是错误的:

Binding="{Binding FullNames}"
于 2018-05-21T05:17:00.713 回答