2014-12-13 6 views
0

У меня есть несколько DataGrids для управления данными моей базы данных. Функциональность также включает добавление новых строк. Проблема в том, что в моем примере есть зависимость между созданной строкой и DataContext DataGrid, установленным другим DataGrid. В моем случае у меня есть:WPF DataGrid - добавить новую строку/DataContext

Стороны - сторона может иметь n треков. Если вы измените выбор PartyGridGrid, вы измените представление Track TrackGrid.

Треки - трек имеет по существу ссылку на партию.

XAML:

 <DataGrid AutoGenerateColumns="False" SelectionMode="Single" DataContext="{Binding CurrentParty}" ItemsSource="{Binding Tracks}" SelectedItem="{Binding CurrentTrack}"> 
      <DataGrid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="_Delete" Command="{Binding DeleteTrackCommand}"/> 
       </ContextMenu> 
      </DataGrid.ContextMenu> 
      <DataGrid.Columns> 
       <DataGridTextColumn IsReadOnly="True" Header="Votes" Binding="{Binding Path=Votes}"> 
        <DataGridTextColumn.CellStyle> 
         <Style TargetType="DataGridCell"> 
          <Setter Property="Background" Value="LightGray" /> 
         </Style> 
        </DataGridTextColumn.CellStyle> 
       </DataGridTextColumn> 
       <DataGridTemplateColumn Header="Interpret" IsReadOnly="False"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=Interpret}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
        <DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Path=Interpret}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellEditingTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Title" IsReadOnly="False"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=Title}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
        <DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Path=Title}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellEditingTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="URL" IsReadOnly="False"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=Url}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
        <DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Path=Url}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellEditingTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

код в ViewModel:

public TrackVM() { 
    // requires the "CurrentParty" from DataContext. 
} 

Я мог бы получить доступ к DataContext в коде позади, но это своего рода перерыв архитектуру MVVM, не так. То, что я хочу сделать/вместо этого: передать объект CurrentParty в конструктор по умолчанию.

ответ

0

В качестве обходного пути я сделал следующее: Я завернул TrackVM в ObservableCollection в классе-оболочке под названием TracksVM. Там я зарегистрировал функцию в событии CollectionChanged коллекции. Этот обработчик событий устанавливает необходимую ссылку через свойство, если новый TrackVM был добавлен.

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