2015-08-07 4 views
0

У меня проблемы с datagrid. Когда я запускаю событие RowEditEnding, я получаю следующую ошибку: «Двусторонняя привязка требует Path или XPath». Я хочу исправить это весь день, но не смог найти решение. Любые идеи приветствуются. Заранее спасибо!WPF DataGrid с ComboBox - Требуется двухсторонняя привязка Path или XPath

XAML

<Window.Resources> 
    <staticData:AlarmFilesList x:Key="AlarmFilesList"/> 
</Window.Resources> 

XAML

<DataGrid x:Name="alarmProfilesDataGrid" Margin="10,60,10,50" AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False"> 
          <DataGrid.Columns> 
           <DataGridTextColumn Binding="{Binding AlarmTime, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Alarm Time" Width="75" MinWidth="75"/> 
           <DataGridTemplateColumn Header="Alarm File" Width="*" MinWidth="100"> 
            <DataGridTemplateColumn.CellTemplate> 
             <DataTemplate> 
              <TextBlock Text="{Binding AlarmFile}"/> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
            <DataGridTemplateColumn.CellEditingTemplate> 
             <DataTemplate> 
              <ComboBox ItemsSource="{StaticResource AlarmFilesList}" SelectedItem="{Binding AlarmFileDescription}" SelectionChanged="ComboBox_SelectionChanged"/> 
              <!--<ComboBox x:Name="AlarmFilesListComboBox" Text="{Binding AlarmFileDescription, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding Id, NotifyOnSourceUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="AlarmFileDescription" SelectedValuePath="Id" Loaded="AlarmFilesListComboBox_Loaded" />--> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellEditingTemplate> 
           </DataGridTemplateColumn> 
          </DataGrid.Columns> 
         </DataGrid> 

Вот класс, который заполняет выпадающий список

class AlarmFilesList : List<string> 
{ 
    BreakBuzzerEntities breakBuzzerContext = new BreakBuzzerEntities(); 
    public AlarmFilesList() 
    { 
     var alarmFiles = (from af in breakBuzzerContext.AlarmFiles select af).ToList(); 
     foreach (AlarmFile currentFile in alarmFiles) 
     { 
      this.Add(currentFile.AlarmFileDescription); 
     } 
    } 
} 

End здесь также соответствующий код

private void getSelectedAlarmProfile(AlarmProfileDefinition selectedAP) 
    { 
     Mouse.OverrideCursor = Cursors.Wait; 
     List<AlarmProfileData> alarmProfileData = new List<AlarmProfileData>(); 
     var alarmProfileList = (from alarmProfile in breakBuzzerContext.AlarmProfiles 
           where alarmProfile.AlarmProfileDefinitionId == selectedAP.Id 
           select alarmProfile).ToList().OrderBy(x => x.AlarmTime); 
     foreach (AlarmProfile alarmProfileItem in alarmProfileList) 
     { 
      alarmProfileData.Add(new AlarmProfileData { AlarmTime = alarmProfileItem.AlarmTime, AlarmTimeId=alarmProfileItem.Id, AlarmFile=alarmProfileItem.AlarmFile.AlarmFileDescription, AlarmFileId=alarmProfileItem.AlarmFileId }); 
     } 
     alarmProfilesDataGrid.ItemsSource = null; 
     alarmProfilesDataGrid.ItemsSource = alarmProfileData; 
     alarmProfilesDataGrid.DataContext = this; 
     Mouse.OverrideCursor = null; 
    } 

    public class AlarmProfileData 
    { 
     public TimeSpan AlarmTime { get; set; } 
     public int AlarmTimeId { get; set; } 
     public string AlarmFile { get; set; } 
     public int AlarmFileId { get; set; } 
    } 
    private void alarmProfilesDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     var apData = alarmProfilesDataGrid.SelectedItem; 
     if (apData != null) 
     { 

     } 
    } 
+0

где указано ваше свойство AlarmFileDescription? – shreesha

+0

Это столбец в таблице AlarmFile в базе данных – Steven

ответ

0

Если вы следите за MVVM, вам необходимо добавить ItemsSource="{Binding alarmProfileData}", если вы следите за классическим шаблоном, то вам необходимо добавить ItemsSource="{Binding}" в качестве атрибута в свою сетку. чтобы показать, что сетка связывается динамически. следовательно, ваша сетка Определение будет выглядеть так:

<DataGrid x:Name="alarmProfilesDataGrid" ItemsSource="{Binding}" Margin="10,60,10,50" AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False"> 
+0

Я следую классическому шаблону, раньше добавлял ItemsSource = "{Binding}", но это привело к той же ошибке. – Steven

Смежные вопросы