#c# #mvvm #uwp #datacontext
#c# #mvvm #uwp #datacontext
Вопрос:
Существует форма, в которой находится метка, а также пользовательский элемент управления, заключенный в кнопку. Мне нужно изменить текст в текстовом блоке, нажав кнопку в пользовательском элементе управления. Я не использовал никаких фреймворков MVVM. Основной XAML:
<Page.DataContext>
<local:MainViewModel />
</Page.DataContext>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="553*" />
<ColumnDefinition Width="197*" />
</Grid.ColumnDefinitions>
<local:ControlView Grid.Column="1" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
<TextBlock Grid.Column="0" Foreground="Black" FontSize="50" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" Text="{Binding UserText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
Управление пользователем Xaml:
<Grid>
<Button Width="300" Height="100" FontSize="50" Command="{Binding}"
VerticalAlignment="Center" HorizontalAlignment="Center" Content="Print chart" />
</Grid>
Основная виртуальная машина:
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
SetText = new RelayCommand(SetUserText);
}
public ICommand SetText { get; set; }
public string UserText { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void SetUserText()
{
UserText = "Hello World!";
RaisePropertyChanged(nameof(UserText ));
}
protected void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
И я создаю пустой пользовательский элемент управления VN:
public class ControlViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
// And what should I do here?
}
Итак, как правильно реализовать команды из пользовательского элемента управления в main view, например, свойство setText?
Ответ №1:
Ваша главная проблема заключается в использовании ControlViewModel
. UserControls
такие, ControlView
которые, вообще говоря, должны не устанавливать свои собственные DataContext
для какой-либо специализированной модели представления, а скорее наследовать DataContext
от своего родительского элемента.
Предполагая, что вы позволяете элементу управления наследовать DataContext
, вы можете добавить к нему свойство зависимости и привязать команду к этому:
<local:ControlView YourCommand="{Binding SetText}" />
ControlView.xaml:
<UserControl ... Name="uc">
<Button Command="{Binding YourCommand, ElementName=uc}" />
Комментарии:
1. Спасибо! Ваш ответ очень полезен!