Как исправить исключение «Двусторонняя привязка требует пути или XPath» в WPF Datagrids? - PullRequest
13 голосов
/ 26 февраля 2012

Предпосылки / контекст для этого вопроса: У меня есть настольное приложение WPF. Он использует LINQ to SQL для подключения к своей базе данных SQL и отображает свои данные в WPF Datagrids. Он работал довольно хорошо, но производительность была проблемой, потому что LINQ может быть смертельно медленным, поэтому я как можно больше переключал свою логику и элементы управления пользовательским интерфейсом из контекстов базы данных LINQ, а вместо этого загружал их в локальные переменные, которые очень похожи на объекты LINQ, что значительно повышает производительность.

Проблема: Когда я тестирую свои Datagrids, я получаю новое исключение " Для двустороннего связывания требуется Path или XPath. ", когда я пытаюсь изменить значение в определенном (целочисленном) столбце одного Datagrid, хотя редактирование строковых столбцов работало нормально. Я не понимаю, почему я получаю это или что с этим делать.

Так что это работало, когда 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 ]

15 голосов
/ 27 апреля 2017

Я столкнулся с этой проблемой со связанным текстовым полем. Мое решение состояло в том, чтобы явно связать с ".":

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

Это добилось цели.

4 голосов
/ 01 февраля 2016

Ошибка "двусторонняя привязка требует пути или XPath" может быть вызвана небольшой разницей в имени пути в XAML по сравнению с именем в элементе привязки c #.Письмо заглавных букв действительно важно!Это была моя проблема.

XAML:

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

C #:

public string Totalheure { get; set; }

это приведет к двустороннему связыванию, требующему ошибки Path или XPath, поскольку они не совпадают ипрограммы не могут найти обязательный путь!

Может быть, это поможет кому-то еще, кто совершил ту же ошибку

3 голосов
/ 26 февраля 2012

Хорошо, набрав все это, я попробовал что-то, что сработало. Я в любом случае отправляю сообщения, если это помогает другим.

Решением было добавить к проблеме переменные-члены, которые связаны:

{получить; задавать; }

Как в:

    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; }
0 голосов
/ 21 мая 2018

Иногда можно сделать странную мелочь, когда ты устаешь в конце дня.У меня есть привязка Datagrid к Entity Framework Entity, называемая Dependent - поля Name_of_Dependant / Relationship / Date_of_Birth.Каким-то образом я решил создать новые свойства: FullNames / Relationship / DateOfBirth - все нужные типы.
Так что в моей таблице данных я связываюсь с

ObservableCollection<Dependant> 

Но мои столбцы должны затем связываться со столбцами втаблица сущностей зависимая.Так что это правильно:

Binding="{Binding Name_of_Dependant}"

Это было неправильно:

Binding="{Binding FullNames}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...