2016-10-31 2 views
0

J'ai une application avec le modèle suivant avec un job de classe parente et childRequirements enfants. J'utilise la lumière mvvm et un modèle de vue. Le formulaire a trois sections. on est une grille de données avec tous les emplois. L'utilisateur sélectionne un travail qui déclenche un travail sélectionné dans le modèle de vue.Liaison de la grille d'enfants WPF au parent

Les propriétés du travail sélectionné sont affichées dans des zones de texte et une grille de données est affichée pour les JobRequirements enfants.

JobRequirements est lié aux jobsjob.jobRequirements sélectionnés.

Pour les exigences de travail existantes, tout fonctionne comme prévu.

La grille de données jobRequirement, cependant, ne sera pas liée à un nouveau travail. L'utilisateur doit l'ajouter activement en utilisant le code dans viewModel. Ce système fonctionne mais existe-t-il un moyen de le faire en n'utilisant que le XAML?

Est-ce que je peux ajouter un nouveau travail et que la grille de données d'exigences sait que les exigences ajoutées sont ajoutées au nouveau travail?

Modèle:

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; } 
} 

Voir Modèle:

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); 
    } 
} 

Voici le XAML pertinent

<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> 

Répondre

0

Essayez la Rubrique d'exigence de liaison ItemSource à selectedJob au lieu de selectedJob.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

Merci pour la suggestion, mais cela ne fonctionne pas. La grille de données jobRequirements devient complètement vide et non réactive. –

+0

La deuxième grille est-elle vide même si un travail est sélectionné dans la première grille? – Aalok

+0

Vérifiez également toute erreur de liaison. – Aalok