Comment résoudre l'exception «liaison bidirectionnelle nécessite une exception Path ou XPATH» dans les datagrides WPF?

StackOverflow https://stackoverflow.com/questions/9449689

Question

Contexte / contexte de cette question:J'ai une application WPF Desktop. Il utilise LINQ en SQL pour se connecter à sa base de données SQL, et il affiche ses données dans les datagrides WPF. Cela fonctionnait assez bien, mais les performances étaient un problème car LINQ peut être mortelle lente, donc j'ai changé ma logique et mes commandes d'interface utilisateur dans les contextes de la base de données LINQ autant que possible, et les charger plutôt en variables locales qui sont très similaires à Les objets Linq, qui améliorent massivement les performances.

Le problème:Alors que je teste mes datagrides, j'obtiens maintenant une nouvelle exception "La liaison bidirectionnelle nécessite un chemin ou un XPATH."Lorsque j'essaie de modifier la valeur dans une certaine colonne (entière) d'un dataGrid, bien que les colonnes de chaîne de modification aient bien fonctionné. Je ne comprends pas pourquoi je reçois ceci, ou quoi faire à ce sujet.

Cela a donc fonctionné lorsque le datagrid.datacontext a été défini sur une association entité LINQ, mais cela ne fonctionne presque que lorsqu'il est défini sur une liste d'objets simples. J'ai essayé de changer la liste par une collection d'observation, mais cela n'a eu aucun effet apparent.

J'ai examiné une douzaine de questions connexes différentes ici et sur d'autres sites, et je ne vois rien qui semble aider.

Actuellement, j'ai:

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

qui est lié par le code:

dgDays.DataContext = TheMember.RAM_Member_Requirements_Days;

qui est défini comme:

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

dont les membres liés sont:

    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;

J'ai trouvé un correctif très simple peu de temps après avoir tapé ceci, que je publierai lorsque le site me laissera après son retard de 8 heures.

Était-ce utile?

La solution 3

Ok, eh bien, après avoir tapé tout ça, j'ai essayé quelque chose qui a fonctionné. Je poste quand même, au cas où cela aide les autres.

La solution consistait à ajouter aux variables des membres du problème qui sont liées:

{ obtenir; Positionner; }

Un péché:

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

Autres conseils

J'ai rencontré ce problème avec une zone de texte liée. Ma solution était de se lier explicitement à ".":

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

Cela a fait l'affaire.

Un défaut "liant bidirectionnel nécessite un chemin de chemin ou XPATH" peut être provoqué par une petite différence dans le nom du chemin dans le XAML vs celui de l'élément de liaison C #. La lettre des Capitals est vraiment importante! C'était mon problème.

XAML:

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

C #:

public string Totalheure { get; set; }

Cela provoquera une liaison bidirectionnelle nécessitant une erreur de chemin ou XPATH car elles ne sont pas exactement les mêmes et les programmes ne sont pas en mesure de trouver le chemin de liaison!

Peut-être que cela aidera quelqu'un d'autre qui a fait la même erreur

On peut parfois faire une petite chose étrange lorsque vous vous fatiguez à la fin de la journée. J'ai une liaison de dataGrid à une entité de cadre d'entité appelé DepenDend - Fields name_of_dependant / relation / date_of_birth. D'une manière ou d'une autre, j'ai décidé de créer de nouvelles propriétés: FullNames / Relation / DateOfbirth - tous les bons types.
Donc, dans mon dataGrid, je me lie à un

ObservableCollection<Dependant> 

Mais mes colonnes devraient alors se lier aux colonnes de ma table d'entité dépendante. C'est donc correct:

Binding="{Binding Name_of_Dependant}"

C'était faux:

Binding="{Binding FullNames}"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top