2016-10-31 3 views
0

У меня есть приложение со следующей моделью с заданием родительского класса и дочерними заданиями для работы с детьми.Связывание сетки дочерних элементов WPF с родителем

Я использую свет mvvm и модель представления. Форма состоит из трех разделов. один представляет собой набор данных со всеми заданиями. Пользователь выбирает задание, которое вызывает выбранную фигуру в модели представления.

Свойства selectedjob отображаются в текстовых полях, а для дочерних заданий JobRequirements отображается датадайд.

JobRequirements привязаны к выбранным критериям job.job.

Для существующих заданий на работу все работает так, как ожидалось.

Номенклатура jobRequirement, однако, не привязывается к новой задаче. Пользователь должен активно добавлять его с помощью кода в viewModel. Эта система работает, но есть ли способ работать с использованием только XAML?

То есть я могу добавить новое задание и получить сетку данных требований, чтобы добавляемые требования были добавлены в новое задание?

Модель:

public class Job 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Int64 id { get; set; } 

    public string jobshortname { get; set; } 

    public virtual ObservableCollection<JobRequirement> jobRequirements { get; set; } 

}

public class JobRequirement 

{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Int64 id { get; set; } 
    [ForeignKey("job")] 
    public Int64 Jobid { get; set; } 
    public DateTime deadline { get; set; } 
    public string comment { get; set; } 
    public virtual Job job { get; set; } 
    public virtual Requirement requirement { get; set; } 
} 

вид Модель:

public class jobViewModel : ViewModelBase 
{ 
    private DataService _ds; 
    public const string jobscPropertyName = "jobsc"; 
    public const string jobrequirementsPropertyName = "requirements"; 
    private ObservableCollection<Requirement> _requirements ; 
    public ObservableCollection<Requirement> requirements 
    { 
     get 
     { 
      return _requirements; 
     } 
     set 
     { 
      if (_requirements == value) 
      { 
       return; 
      } 
      _requirements = value; 
      RaisePropertyChanged(jobrequirementsPropertyName); 
     } 
    } 

    private ObservableCollection<Job> _jobsc; 
    public ObservableCollection<Job> jobsc 
    { 
     get { return _jobsc; } 
     set 
     { 
      if (_jobsc == value) 
      { 
       return; 
      } 
      _jobsc = value; 
      RaisePropertyChanged(jobscPropertyName); 
     } 
    } 
    public const string selectedJobPropertyName = "selectedJob"; 
    private Job _selectedJob ; 
    public Job selectedJob 
    { 
     get 
     { 
      return _selectedJob; 
     } 
     set 
     { 
      if (_selectedJob == value) 
      { 
       return; 
      } 
      _selectedJob = value; 
      RaisePropertyChanged(selectedJobPropertyName); 
     } 
    } 
    public RelayCommand NewJob { get; private set; } 
    public RelayCommand SaveJob { get; private set; } 
    public RelayCommand Newjr { get; private set; } 
    public jobViewModel(DataService ds) 
    { 
     _ds = ds; 
     NewJob = new RelayCommand(getnewjob); 
     SaveJob = new RelayCommand(savejob); 
     Newjr = new RelayCommand(addRequirement); 
     requirements = _ds.getAllRequirements(); 
     jobsc = ds.GetAllJobs();  
    } 
    private void addRequirement() 
    { 
     JobRequirement jr = new JobRequirement(); 
     jr.Jobid = selectedJob.id; 
     jr.deadline = DateTime.Today.AddMonths(1); 
     selectedJob.jobRequirements.Add(jr); 
    } 
    private async void savejob() 
    { 
     selectedJob = await _ds.saveJob(selectedJob); 
    } 
    private void getnewjob() 
    { 
     selectedJob = new Models.Job(); 
     jobsc.Add(selectedJob); 
    } 
} 

Вот соответствующий код XAML

<DockPanel LastChildFill="True" Grid.Row="1" Margin="10,0,10,0"> 
    <DataGrid x:Name="jobDataGrid" FlowDirection="RightToLeft" DockPanel.Dock="Left" 
       AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding jobsc}" Grid.Row="1" 
       SelectedItem="{Binding selectedJob, Mode=TwoWay}" RowDetailsVisibilityMode="VisibleWhenSelected" CanUserAddRows="False" 
     >   
     <DataGrid.Columns> 

       <DataGridTextColumn x:Name="idColumn" Binding="{Binding id}" Header="id" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="jobshortnameColumn" Binding="{Binding jobshortname}" Header="jobshortname" Width="SizeToHeader"/> 
      <DataGrid.Columns> 
    </DataGrid> 
     <Grid x:Name="jrframe" DockPanel.Dock="Right"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="20"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <StackPanel Orientation="Horizontal" FlowDirection="RightToLeft" Grid.Row="0"> 
     <--Button to add new requirement --> 
       <Button x:Name="jrbutton" Content="New" Command="{Binding Newjr}"/> 
      </StackPanel> 
<-- Requirement Grid --> 
    <DataGrid x:Name="jobRequirementsDataGrid" Grid.Row="1" CanUserAddRows="False" 
       AutoGenerateColumns="False" EnableRowVirtualization="True" 
       ItemsSource="{Binding selectedJob.jobRequirements, Mode=TwoWay}" RowDetailsVisibilityMode="VisibleWhenSelected"> 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="commentColumn" Binding="{Binding comment}" Header="comment" Width="SizeToHeader"/> 
      <DataGridTemplateColumn x:Name="deadlineColumn" Header="deadline" Width="SizeToHeader"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DatePicker SelectedDate="{Binding deadline, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn x:Name="idColumn1" Binding="{Binding id}" Header="id" Width="SizeToHeader"/> 
      <DataGridTextColumn x:Name="JobidColumn" Binding="{Binding Jobid}" /> 

      </DataGrid.Columns> 
    </DataGrid> 
     </Grid> 
     <StackPanel FlowDirection="RightToLeft"> 
      <Grid x:Name="grid1" DataContext="{Binding selectedJob, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Top"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/>     
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/>     
       </Grid.RowDefinitions> 
       <TextBox x:Name="idTextBox" Grid.Column="1" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="1" Text="{Binding id, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/> 
       <Label Content="jobshortname:" Grid.Column="2" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center"/> 
       <TextBox x:Name="jobshortnameTextBox" Grid.Column="3" HorizontalAlignment="Left" Height="23" Margin="3" Grid.Row="0" Text="{Binding jobshortname, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" VerticalAlignment="Center" Width="120"/> 
          </Grid> 
     </StackPanel> 


    </DockPanel> 

ответ

0

Попробуйте привязку к требованию Grid ItemSource для выбранногоJob вместо выбранныхJob.jobRequirements.

<-- Requirement Grid --> 
<DataGrid x:Name="jobRequirementsDataGrid" Grid.Row="1" CanUserAddRows="False" 
      AutoGenerateColumns="False" EnableRowVirtualization="True" 
      ItemsSource="{Binding selectedJob, Mode=TwoWay}" RowDetailsVisibilityMode="VisibleWhenSelected"> 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="commentColumn" Binding="{Binding jobRequirements.comment}" Header="comment" Width="SizeToHeader"/> 
     <DataGridTemplateColumn x:Name="deadlineColumn" Header="deadline" Width="SizeToHeader"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DatePicker SelectedDate="{Binding jobRequirements.deadline, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn x:Name="idColumn1" Binding="{Binding jobRequirements.id}" Header="id" Width="SizeToHeader"/> 
     <DataGridTextColumn x:Name="JobidColumn" Binding="{Binding jobRequirements.Jobid}" /> 

     </DataGrid.Columns> 
</DataGrid> 
+0

Спасибо за предложение, но оно не работает. Задание datagrid jobRequirements становится полностью пустым и не реагирует. –

+0

Является ли вторая сетка пустой, даже если задание выбрано в первой сетке? – Aalok

+0

Также проверьте наличие ошибок. – Aalok

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