У меня есть две сетки: родительская сетка, которая показывает список «Разделов», и дочерняя, которая показывает список «Документов».
То, чего я хочу достичь, это иметь ComboBox в дочерней сетке. который может использоваться для изменения раздела.
Мой ViewModel имеет коллекцию разделов, к которой привязывается родительская сетка, а затем дочерняя сетка привязывается к свойству Documents в SelectedSection.
private ObservableCollection<Section> _sections;
public ObservableCollection<Section> Sections
{
get => _sections;
set => SetProperty(ref _sections, value, nameof(Sections));
}
private Section _selectedSection;
public Section SelectedSection
{
get => _selectedSection;
set => SetProperty(ref _selectedSection, value, nameof(SelectedSection));
}
Чтобы заставить его работать правильно, я должен подключить событие (выполненное в ViewModel) к каждому документу в каждом разделе, чтобы определить, изменился ли раздел из ComboBox, а затем вручную вызвать RaisePropertyChanged, чтобы обновить sh пользовательский интерфейс.
//This method simply calls NotifyPropertyChanged
newDocument.DocumentSectionChanged += NewDocument_DocumentSectionChanged;
Есть ли способ, как я могу получить этот refre sh сам по себе?
Я пытаюсь опубликовать, какой код релевантен, поэтому ниже приведен дополнительный код, который может иметь отношение. Рад опубликовать что-нибудь еще, просто оставьте комментарий.
Классы для них настроены так:
public class Section : ViewModelBase, ICloneable
{
private string _name;
public string Name
{
get => _name;
set => SetProperty(ref _name, value, nameof(Name));
}
private ObservableCollection<Document> _documents;
public ObservableCollection<Document> Documents
{
get => _documents;
set => SetProperty(ref _documents, value, nameof(Documents));
}
}
и класс документа:
public class Document : ViewModelBase, ICloneable
{
[JsonProperty(PropertyName = "Description")]
private string _description;
public string Description
{
get => _description;
set => SetProperty(ref _description, value, nameof(Description));
}
[JsonProperty(PropertyName = "Date")]
private DateTime _date;
public DateTime Date
{
get => _date;
set => SetProperty(ref _date, value, nameof(Date));
}
private Section _section;
public Section Section
{
get => _section;
set
{
var eventArgs = new DocumentSectionChangedEventArgs();
eventArgs.OldSection = _section;
SetProperty(ref _section, value, nameof(Section));
eventArgs.NewSection = value;
DocumentSectionChanged?.Invoke(this, eventArgs);
}
}
public event EventHandler<DocumentSectionChangedEventArgs> DocumentSectionChanged;
}
Вот часть XAML для родительской сетки.
<dxg:GridControl x:Name="sectionGrid" AutoGenerateColumns="None" ItemsSource="{Binding Sections, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedSection}" SelectionMode="Row">
, а вот часть дочерней сетки.
<dxg:GridControl x:Name="documentsGrid" ItemsSource="{Binding SelectedSection.Documents}" Grid.Row="1">
<dxg:GridColumn FieldName="Section" Header="Section" Width="Auto">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
<ContentControl>
<dxe:ComboBoxEdit x:Name="PART_Editor" ItemsSource="{Binding View.DataContext.Sections}" DisplayMember="Name" ShowBorder="False" />
</ContentControl>
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>
</dxg:GridControl>