此問題的背景/上下文: 我有一個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小時的延遲之後,讓我我會發布後不久。
如果這對你來說很神祕,那是因爲你不能綁定到字段,只能綁定屬性。有關解釋原因,請參閱: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
@MatrixManAtYrService謝謝,儘管在閱讀之後,它對我仍然很神祕。顯然我需要閱讀字段和屬性的定義和區別。 – Dronz 2015-01-08 19:12:13
Heh。好的,做一些閱讀,我發現我一直在使用字段和屬性,而不知道C#調用了什麼。有趣的,謝謝。 – Dronz 2015-01-08 19:15:33