2012-02-26 26 views
9

この質問の背景/文脈: 私はWPFデスクトップアプリケーションを持っています。 LINQ to SQLを使用してSQLデータベースに接続し、そのデータをWPF Datagridに表示します。 LINQが致命的に遅くなる可能性があるため、パフォーマンスは問題ありませんでした。そのため、ロジックとUIコントロールをできるだけLINQデータベースのコンテキストから切り離し、代わりにそれらを非常に類似したローカル変数にロードしていますパフォーマンスを大幅に向上させるLINQオブジェクト。WPFデータグリッドで「双方向バインディングにパスまたはXPathが必要」という例外を修正するにはどうすればよいですか?

問題: 私はDataGridのテストとして、私は今、新しい例外を取得しています「が結合双方向のパスやXPathを必要と。」私は、特定の(整数で値を編集しようとすると、 )列を編集していましたが、文字列の編集はうまくいきました。私はなぜこれを取得しているのか、それについて何をすべきか理解していません。

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時間の遅延の後に私をすることができますときに私は投稿しますれ、すぐにこれを入力した後、非常に簡単な修正を見つけました。

答えて

3

[OK]をよく入力して、私はうまくいきました。私はとにかく、他人を助けるために投稿しています。

ソリューションは、バインドされている問題のメンバ変数に追加しました:

{取得します。セット; }

のように:「双方向バインディングは、パスを要求するか、XPathの」障害バインディングC#で1対XAMLでパス名にほとんど差によって原因となることができ

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

+0

@MatrixManAtYrServiceありがとう、それを読んだ後でも、それはまだ私には神秘的です。どうやら、フィールドとプロパティの定義と相違点を読んでみる必要があります。 – Dronz

+1

Heh。さて、ちょっと読んで、私はフィールドとプロパティを使用していることを知っているC#を知らずに参照してください。興味深い、ありがとう。 – Dronz

3

素子。大文字の手紙は本当に重要です!それが私の問題でした。

XAML:

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

C#の:彼らはまったく同じではなく、プログラムができないため

public string Totalheure { get; set; } 

これはパスまたはXPathのエラーを必要と結合双方向の原因となりますバインディングパスを見つけてください!

多分それは私がバインドされたテキストボックスでこの問題に遭遇した

5

同じミスをした他の誰かを助けます。私の解決策は、「。」に明示的にバインドすることでした。

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

これはトリックでした。

関連する問題