Как привязать command и context из UserControl к MainView UWP MVVM

#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. Спасибо! Ваш ответ очень полезен!