#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. Не могли бы вы пояснить, что вы имели в виду, передавая их напрямую? Если вы вставите пример кода, я смогу рассказать об этом подробнее