web-dev-qa-db-ja.com

WPFデータグリッドで「双方向バインディングにはパスまたはXPathが必要」という例外を修正するにはどうすればよいですか?

この質問の背景/コンテキスト: WPFデスクトップアプリケーションがあります。 LINQ to SQLを使用してSQLデータベースに接続し、データをWPFDatagridsに表示します。かなりうまく機能していましたが、LINQが非常に遅くなる可能性があるため、パフォーマンスが問題でした。そのため、ロジックとUIコントロールを可能な限りLINQデータベースコンテキストから切り替えて、代わりに次のようなローカル変数にロードしました。パフォーマンスを大幅に向上させるLINQオブジェクト。

問題:データグリッドをテストすると、新しい例外が発生します "双方向バインディングにはPathまたはXPathが必要です。 "文字列列の編集は正常に機能していましたが、1つのデータグリッドの特定の(整数)列の値を編集しようとすると。なぜこれを取得しているのか、どうしたらよいのかわかりません。

したがって、datagrid.datacontextがLINQエンティティの関連付けに設定されている場合は機能しましたが、プレーンオブジェクトのリストに設定されている場合にのみ機能します。リストをObservableCollectionに変更しようとしましたが、明らかな効果はありませんでした。

私はここや他のサイトで約12の異なる関連する質問を見てきましたが、役立つと思われるものは何も見当たりません。

現在私は持っています:

<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時間遅れて許可したときに投稿します。

18
Dronz

さて、それをすべて入力したので、うまくいくものを試しました。それが他の人を助ける場合に備えて、とにかく投稿しています。

解決策は、バインドされているメンバー変数を問題に追加することでした。

{ 取得する;セットする; }

のように:

    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; }
3
Dronz

バインドされたテキストボックスでこの問題が発生しました。私の解決策は、明示的に「。」にバインドすることでした。

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

それがトリックでした。

16
Lynn Crumbling

「双方向バインディングにはパスまたはXPathが必要です」という障害は、XAMLのパスの名前とc#バインディング要素のパスの名前のわずかな違いが原因である可能性があります。大文字は本当に重要です!それが私の問題でした。

XAML:

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

C#:

public string Totalheure { get; set; }

これにより、PathまたはXPathエラーを必要とする双方向バインディングが発生します。これらは完全に同じではなく、プログラムはバインディングパスを見つけることができないためです。

多分それは同じ間違いをした他の誰かを助けるでしょう

4
Mr Rubix

一日の終わりに疲れたとき、時々奇妙な小さなことをすることができます。 DependentというエンティティFrameworkEntityにバインドされているDatagridがあります-フィールドName_of_Dependant/Relationship/Date_of_Birth。どういうわけか私は新しいプロパティを作成することに決めました:FullNames/Relationship/DateOfBirth-すべての正しいタイプ。
データグリッドでバインドします

ObservableCollection<Dependant> 

しかし、私の列は、エンティティテーブルDependantの列にバインドする必要があります。したがって、これは正しいです:

Binding="{Binding Name_of_Dependant}"

これは間違っていました:

Binding="{Binding FullNames}"
0
Ryno Potgieter