MVVM Какой правильный способ обмена данными из модели родительского представления в модели дочернего представления? - PullRequest
0 голосов
/ 07 мая 2019

В моем приложении WPF я должен делиться ObservableCollection из модели родительского представления для умножения моделей дочерних представлений, а модели дочерних представлений также должны подписываться на события CollectionChanged. Если я передам коллекции через параметры конструктора дочерней модели, их количество будет расти, возможно, в будущем.

Я рассмотрел шаблоны Mediator и EventAggregator, но не мог понять, как их правильно применять в моей ситуации.

class ViewModel : INotifyPropertyChanged
{
     protected void OnPropertyChanged( ... ) { ... }
}

class MainViewModel : ViewModel
{
    public ObservableCollection<ChildVM_1> Childs_1 { get; }
    public ObservableCollection<ChildVM_2> Childs_2 { get; }
    public ObservableCollection<ChildVM_3> Childs_3 { get; }

    public void Load( ... )
    {
        // Fill Childs_1 and Childs_2
        foreach( ... )
        {
            object par1 = ...;
            object par2 = ...;
            Childs_3.Add( new ChildVM_3( par1, par2 ) );
        }
    }
}

class ChildVM_1 : ViewModel { ... }
class ChildVM_2 : ViewModel { ... }
class ChildVM_3 : ViewModel
{
    // Selected value for ComboBox
    public SubChildVM SelectedValue
    {
        get{ ... }
        set
        {
            ...
            OnPropertyChanged();
        }
    }
    // Items Source for ComboBox
    public ObservableCollection<SubChildVM> SubChilds { get; }

    public ChildVM_3( object par1, object par2 )
    {
        object par3 = ...;
        foreach( ... )
        {
            if( ... )
            {
                 SubChilds.Add( new SubChildVM_1( par1, par2, par3 /* Here I need MainViewModel.Childs_1 */ );
            }
            else
            {
                 SubChilds.Add( new SubChildVM_2( par1, par2, par3 /* Here I need MainViewModel.Childs_2 */ );
            }
        }
}

abstract class SubChildVM : ViewModel{ ... }
class SubChildVM_1 : SubChildVM 
{
     // Selected value for nested ComboBox;
     public ChildVM_1 SelectedValue 
     {
        get{ ... }
        set
        {
            ...
            OnPropertyChanged();
        }
     }

     // IsEnabled property for ComboBoxItem.
     // Determines whether this item can be selected from the drop-down list.
     public bool IsEnabled
     {
        get{ ... }
        set
        {
            ...
            OnPropertyChanged();
        }
     }
     // Items Source for nested ComboBox
     // What the best way to retrive this reference from MainViewModel???
     public ObservableCollection<ChildVM_1> Childs_1 { get; }

     public SubChildVM_1( object par1, object par2, object par3 )
     {
          IsEnabled = Childs_1.Count > 0;
          if( IsEnabled )
          {
              // Set default selected value
              SelectedValue = Childs_1.First();
          }
          Childs_1.CollectionChanged += UpdateIsEnabled;
     }

     private void UpdateIsEnabled( ... )
     {
         IsEnabled = Childs_1.Count > 0;
     }
}

class SubChildVM_2 : SubChildVM 
{
    // Same as SubChildVM_1 but with ChildVM_2 references.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...