Родительские и дочерние сетки WPF MVVM - обновление родительского элемента от дочернего - PullRequest
1 голос
/ 19 февраля 2020

У меня есть две сетки: родительская сетка, которая показывает список «Разделов», и дочерняя, которая показывает список «Документов».

То, чего я хочу достичь, это иметь 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...