Domanda

Sfondo / contesto per questa domanda: Ho un'applicazione desktop WPF. Utilizza LINQ in SQL per connettersi al proprio database SQL e visualizza i suoi dati in WPF DataGrids. Stava lavorando abbastanza bene, ma la performance era un problema perché Linq può essere lento lento, quindi ho cambiato la mia logica e l'interfaccia utente lontano dai contesti del database LINQ il più possibile, ea caricarli in variabili locali che sono molto simili a Gli oggetti LINQ, che migliorano le prestazioni massicciamente.

Il problema: Mentre metto i miei datagrids, ora sto ottenendo una nuova eccezione " rilegatura a due vie richiede un percorso o xpath. " Quando provo a modificare il valore in un certo (numero intero ) Colonna di un DataGrid, anche se la modifica delle colonne della corda non funzionava bene. Non capisco perché sto ottenendo questo, o cosa fare al riguardo.

Così ha funzionato quando il datagrid.DataContext è stato impostato su un'associazione di entità LINQ, ma funziona solo quando funziona solo quando è impostato su un elenco di oggetti semplici. Ho provato a cambiare la lista in un'osservabileCollezione, ma questo non ha avuto effetto apparente.

Ho guardato su una dozzina di diverse domande correlate qui e su altri siti, e non sto vedendo nulla che sembra aiutare.

Attualmente ho:

<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>
.

che è vincolato dal codice:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;
.

che è definito come:

public ObservableCollection<RAM_Member_Requirements_Day> RAM_Member_Requirements_Days = new ObservableCollection<RAM_Member_Requirements_Day>();
.

i cui membri rilegati sono:

    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;
.

Ho trovato una correzione molto semplice poco dopo aver digitato questo, che posterò quando il sito mi consente di ritardare il ritardo di 8 ore.

È stato utile?

Soluzione 3

OK, beh, avendo digitato tutto questo, ho provato qualcosa che ha funzionato.Sto pubblicando comunque, nel caso in cui aiuti gli altri.

La soluzione doveva aggiungere alle variabili dei membri del problema che sono vincolati:

{ottenere;impostato;}

Come in:

    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; }
.

Altri suggerimenti

Ho corso in questo problema con una casella di testo rilegata.La mia soluzione è stata esplicitamente legata a ".":

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

che ha fatto il trucco.

A "Binding bidirezionale richiede il percorso o il guasto XPath" può essere causato da una piccola differenza nel nome del percorso in XAML contro quello nell'elemento di rilegatura C #.Le lettere capitali sono davvero importanti!Questo è stato il mio problema.

XAML:

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

c #:

public string Totalheure { get; set; }
.

Ciò causerà un legame a due vie che richiede un percorso o un errore XPath perché non sono esattamente gli stessi e i programmi non sono in grado di trovare il percorso di rilegatura!

Forse aiuterà qualcun altro che ha fatto lo stesso errore

uno può a volte fare una piccola cosa strana quando ti stanchi alla fine della giornata. Ho un legame DataGrid per un'entità quadro di entità chiamata dipendente - campi NAME_OF_Dependente / relazione / data_of_birth. In qualche modo è stato deciso per creare nuove proprietà: FULLNAMES / Relazione / dataOFbirth - tutti i tipi giusti.
Quindi nel mio datagrid mi legmi a

ObservableCollection<Dependant> 
.

Ma le mie colonne dovrebbero quindi legarsi alle colonne dipendenti dalla tabella delle entità. Quindi questo è corretto:

Binding="{Binding Name_of_Dependant}"
.

Questo è stato sbagliato:

Binding="{Binding FullNames}"
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top