Comment puis-je corriger l'exception "Two-way binding requires Path or XPath" dans les Datagrids WPF?
contexte de cette question: J'ai une application de bureau WPF. Il utilise LINQ to SQL pour se connecter à sa base de données SQL, et il affiche ses données dans Datagrids WPF. Cela fonctionnait assez bien, mais la performance était un problème parce que LINQ peut être extrêmement lent, donc j'ai changé ma logique et les contrôles D'UI loin des contextes de base de données LINQ autant que possible, et au lieu de les charger dans des variables locales qui sont très similaires aux objets LINQ, qui massivement améliore les performances.
Le problème: Alors que je teste mes Datagrids, je reçois maintenant une nouvelle exception "la liaison bidirectionnelle nécessite Path ou XPath. " quand j'essaie d'éditer la valeur dans une certaine colonne (entière) D'un Datagrid, bien que l'édition des colonnes de chaîne ait fonctionné correctement. Je ne comprends pas pourquoi je reçois ça, ni quoi faire.
donc ça a fonctionné quand la datagrade.datacontext a été défini à une association D'entités LINQ, mais il ne fonctionne presque lorsqu'il est réglé à une liste d'objets simples. J'ai essayé de changer la liste pour une collecte observable, mais cela n'a eu aucun effet apparent.
j'ai regardé environ une douzaine de questions reliées 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é une solution très simple peu de temps après avoir tapé ceci, que je posterai quand le site me laissera après son délai de 8 heures.
4 réponses
j'ai rencontré ce problème avec une zone de texte liée. Ma solution était de se lier explicitement à ".":
<TextBox Text="{Binding Path=.}" />
ça a fait l'affaire.
Ok, bien, après avoir tapé tout ça, j'ai essayé quelque chose qui a fonctionné. Je poste de toute façon, au cas où il aide les autres.
la solution a été d'Ajouter aux variables membres du problème qui sont liées:
{ get; set;}
Comme dans:
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; }
une faille "Two-way binding requires Path or XPath" peut être causée par une petite différence dans le nom du chemin dans le XAML par rapport à celui de l'élément de liaison c#. Les majuscules sont très importantes! 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 un chemin ou une erreur XPath car ils ne sont pas exactement les mêmes et les programmes ne peuvent pas 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 bizarre quand on est fatigué à la fin de la journée.
J'ai un Datagrid liant à une entité - cadre d'entité appelée dependent-fields Name_of_dependent / Relationship / Date_of_Birth.
D'une manière ou d'une autre, j'ai décidé de créer de nouvelles propriétés : FullNames / Relationship / DateOfBirth - tous les bons types.
Ainsi dans mon datagrid je lie à un
ObservableCollection<Dependant>
mais mes colonnes devraient alors se lier aux colonnes de ma table entity dépendant. C'est donc correct:
Binding="{Binding Name_of_Dependant}"
C'était faux:
Binding="{Binding FullNames}"