2012-02-26 29 views
9

此問題的背景/上下文: 我有一個WPF桌面應用程序。它使用LINQ to SQL連接到其SQL數據庫,並將其數據顯示在WPF Datagrid中。它工作得很好,但性能是一個問題,因爲LINQ可能會致命地變慢,所以我一直在儘可能地將我的邏輯和UI控件從LINQ數據庫上下文中切換出來,並將它們加載到局部變量中,這些變量與LINQ對象,這大大提高了性能。如何解決WPF Datagrids中的「雙向綁定需要Path或XPath」異常?

問題: 作爲測試我的DataGrid,現在我得到一個新的異常「雙向綁定需要路徑或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小時的延遲之後,讓我我會發布後不久。

回答

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; } 
+2

如果這對你來說很神祕,那是因爲你不能綁定到字段,只能綁定屬性。有關解釋原因,請參閱:http://stackoverflow.com/questions/842575/why-does-wpf-support-binding-to-properties-of-an-object-but-not-fields – MatrixManAtYrService 2015-01-08 17:43:04

+0

@MatrixManAtYrService謝謝,儘管在閱讀之後,它對我仍然很神祕。顯然我需要閱讀字段和屬性的定義和區別。 – Dronz 2015-01-08 19:12:13

+1

Heh。好的,做一些閱讀,我發現我一直在使用字段和屬性,而不知道C#調用了什麼。有趣的,謝謝。 – Dronz 2015-01-08 19:15:33

3

A「雙向綁定需要路徑或XPath」故障可以通過在VS的一個在C#中的XAML的路徑名綁定有一點區別是原因元件。首都信真的很重要!那是我的問題。

XAML:

<DataGridTextColumn Binding="{Binding Path=TotalHeure}" ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/> 

C#:

public string Totalheure { get; set; } 

這將導致一個雙向綁定需要一個Path或XPath錯誤,因爲它們不完全相同,節目不能找到綁定路徑!

也許這將幫助別人誰犯同樣的錯誤

5

我就遇到了這個問題,一個綁定文本框。我的解決方案是明確綁定到「。」:

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

這樣做的伎倆。