Ссылка MainWindowViewModel на экземпляры ViewModel пользовательского управления

#c# #wpf #mvvm

#c# #wpf #mvvm

Вопрос:

У меня есть MainWindow с DataContext, установленным для его класса MainWindowViewModel.cs. Внутри MainWindow у меня есть 2 пользовательских элемента управления, и каждый пользовательский элемент управления привязан к соответствующей ViewModel (например, UserControl1ViewModel.cs и UserControl2ViewModel.cs).

Как я могу получить ссылку на ViewModel пользовательского элемента управления из MainWindowViewModel.cs, чтобы я мог манипулировать их данными?

Ответ №1:

Один из основных подходов, как показано ниже

Создание экземпляра DataContext дочерних пользовательских элементов управления при создании экземпляра DataContext родительского примера

 <StackPanel>
        <TextBox Text="{Binding Text}"/>
        <uc:UC1 DataContext="{Binding Uc1Vm}"/>
        <uc:UC2 DataContext="{Binding Uc2Vm}"/>
    </StackPanel>
  

Ниже приведена основная viewmodel

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel()
        {
            //Below would be replaced by an IOC container instatiation in real world(Unity, MEF etc..)
            Uc1Vm = new UC1ViewModel(),
            Uc2Vm = new UC2ViewModel()
        };
    }
}
  

MainWindowViewModel может состоять из 2 дочерних моделей представления, как показано ниже

 public UC1ViewModel Uc1Vm { get; set; }

public UC2ViewModel Uc2Vm { get; set; }
  

Вы можете манипулировать дочерними элементами управления, как показано ниже, например, из MainWindowViewModel

     /// <summary>
    /// Text is in MainWindowViewModel
    /// </summary>
    public string Text 
    {
        get { return _text;}
        set
        {
            if(value !=_text)
            {
                _text = value;
                //User control1 has Text property in its view model
                Uc1Vm.Text = _text;
                //User control2 has Content property in its view model
                Uc2Vm.Content = _text;
                if(PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Text"));
                }
            }
        }
    }
  

Дайте мне знать, если это поможет или у вас возникнут какие-либо вопросы.

Комментарии:

1. Таким образом, способ получить ссылку на элементы управления — создать их экземпляр в MainViewModel.cs. Нет другого способа получить доступ к ним из MainWindowVM.cs, когда они напрямую передают элементы управления напрямую?

2. Не могли бы вы пояснить, что вы имели в виду, передавая их напрямую? Если вы вставите пример кода, я смогу рассказать об этом подробнее