У меня есть приложение со следующей моделью с заданием родительского класса и дочерними заданиями для работы с детьми.Связывание сетки дочерних элементов 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>
Спасибо за предложение, но оно не работает. Задание datagrid jobRequirements становится полностью пустым и не реагирует. –
Является ли вторая сетка пустой, даже если задание выбрано в первой сетке? – Aalok
Также проверьте наличие ошибок. – Aalok