Предпосылки / контекст для этого вопроса:
У меня есть настольное приложение 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-часовой задержки.