21

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

問題: Datagrid をテストしていると、ある Datagridの特定の (整数) 列の値を編集しようとすると、「双方向バインディングにはパスまたは XPath が必要です」という新しい例外が発生します。正常に動作しています。なぜこれを取得しているのか、どうすればよいのかわかりません。

そのため、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 時間の遅延後に許可したときに投稿します。

4

4 に答える 4

42

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

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

それはトリックをしました。

于 2017-04-27T15:36:52.850 に答える
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; }
于 2012-02-26T16:58:13.103 に答える