WPF DataGridSでは、「双方向バインドにパスまたはXPathが必要な」例外を修正しますか?
-
13-11-2019 - |
質問
背景/コンテキストこの質問のためのコンテキスト: 私はWPFデスクトップアプリケーションを持っています。 SQLデータベースに接続するためにLINQを使用して、そのデータをWPF DataGridSに表示します。 LINQが致命的に遅くなる可能性があるため、パフォーマンスは問題でした。 LINQオブジェクトはパフォーマンスを大幅に向上させます。
問題: 私のデータグリッドをテストすると、私は今新しい例外 " 双方向バインディングでパスまたはxpathが必要です。 1つの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;
私はこれを入力した直後に非常に単純な修正を見つけました。
解決 3
OK、それ以外のすべてを入力したことを、私は働いたものを試しました。私はとにかく投稿しています、それが他の人たちを助けるために。
解決策は、バインドされている問題メンバ変数に追加することでした。
{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; }
. 他のヒント
バインドされたテキストボックスでこの問題に遭遇しました。私の解決策は「」に明示的に結合することでした。:
<TextBox Text="{Binding Path=.}" />
.
トリックをしました。
「双方向バインディングにはパスまたはXPathが必要な」障害が、XAML内のパス名とC#Binding要素内の1つのパスの名前の違いによって引き起こされる可能性があります。首都の手紙は本当に重要です!それは私の問題でした。
xaml:
<DataGridTextColumn Binding="{Binding Path=TotalHeure}" ClipboardContentBinding="{x:Null}" Header="Total Heures" Width="80"/>
.
c#:
public string Totalheure { get; set; }
.
これは、それらが正確に同じではなく、プログラムがバインディングパスを見つけることができないため、パスまたはXPathエラーを必要とする双方向バインディングを引き起こします。
多分それは同じ間違いをした他の誰かを助けるでしょう
時々あなたが一日の終わりに疲れたときに奇妙なことをすることができます。
依存フィールド名NAME_OF_DENCEDANT / RELATIRY / DATE_OF_VIRTEというエンティティフレームワークエンティティへのDataGridバインディングがあります。
どういうわけか私は新しいプロパティを作成することを決めました:fullnames / Relentess / DateoFirth - すべての正しいタイプ。
だから私のDataGridで私はにバインドします
ObservableCollection<Dependant>
.
しかし、私の列は、エンティティテーブルに依存して列にバインドされます。 だからこれは正しいです:
Binding="{Binding Name_of_Dependant}"
.
これは間違っていました:
Binding="{Binding FullNames}"
.