Как передать Command от Button в другую ViewModel

140
26 января 2021, 23:20

Всем привет,

Я новичек в MVVM и возникли проблемы Как передать команду в другую ViewModel и что бы там вызвался определенный метод у меня это перевод текста из TextBox-ов.

В прикрепленном скриншоте у меня при выборе из Combobox-a загружается определенный UserControl по центру далее я вбиваю туда инфу и нажимаю на кнопку внизу для перевода. Проблема в том что эта кнопка привязана к MainViewModel а не к текущей ViewModel(CertificateViewMode)

Даже не знаю что выкладывать по коду, его так дофига для одной этой проблемы.

Постараюсь самое важное только выложить.

Кнопка в интерфейсе

<Button
       x:Name="Btn_Translate"
       Grid.Column="1"
       Height="Auto"
       Command="{Binding TranslateCommand}"
       Style="{StaticResource MaterialDesignFlatButton}"
       ToolTip="Перевести текст">
           <materialDesign:PackIcon
                        Width="35"
                        Height="Auto"
                        VerticalAlignment="Center"
                        Foreground="DarkKhaki"
                        Kind="Translate" />
</Button>

Основная Вьюшка в конструктор передается коллекция UserControl-ов которые уже с генерировались в App.xaml.cs

 public MainViewModel(IEnumerable<ITemplate> modules)
{
    this.OpenFolderTemplate = new RelayCommand(this.OpenFolderAndLoadTemplate);
    this.Templates = modules.OrderBy(m => m.Name).ToList();
    if (this.Templates.Count > 0)
    {
       this.SelectTemplate = this.Templates[0];
    }
}
private RelayCommand TranslateCommand { get; set; }
public List<ITemplate> Templates { get; private set; }
//Выбор UserControl в Combobox-e
public ITemplate SelectTemplate
{
     get
     {
       return selectedTemplate;
     }
     set
     {
        if (value != selectedTemplate)
        {
           if (selectedTemplate != null)
           {
              selectedTemplate.Deactivate();
           }
           selectedTemplate = value;
           selectedTemplate.RelayCommand = TranslateCommand;
           OnPropertyChanged("SelectTemplate");
           OnPropertyChanged("UserInterface");
        }
     }
}

Вот еще что связано с этим

Сам интерфейс шаблона, сюда я добавил только RelayCommand

 interface ITemplate
    {
        string Name { get; }
        UserControl UserInterface { get; }
        RelayCommand RelayCommand { get; set; }
        void Deactivate();
    }

Класс который реализует интерфейс ITemplate

abstract class TemplateBase : ITemplate
    {
        private UserControl view;
        protected abstract UserControl CreateViewAndViewModel();
        public abstract string Name { get; }
        public abstract RelayCommand RelayCommand { get; set; }
        public UserControl UserInterface
        {
            get
            {
                if (view == null)
                {
                    view = CreateViewAndViewModel();
                }
                return view;
            }
        }
        public void Deactivate()
        {
            if (view != null)
            {
                var d = view.DataContext as IDisposable;
                if (d != null) d.Dispose();
                view = null;
            }
        }
    }

Доп класс который уже загружает указанны UserControl и Вьюшку

Birth_Certificate() это уже класс во ViewModel

 class Birth_CertificatePlugin : TemplateBase 
    {
        protected override UserControl CreateViewAndViewModel()
        {
            return new Birth_Certificate() { DataContext = new Birth_CertificateView(RelayCommand) };
        }
public override RelayCommand RelayCommand
        {
            get => throw new System.NotImplementedException();
            set => throw new System.NotImplementedException();
        }
        public override string Name
        {
            get { return "Справка о рождении"; }
        }
    }

Хотел сделать что то типа того при выборе SelectTemplate контрола

selectedTemplate.RelayCommand = TranslateCommand;

Но он на этапе компиляции начинает ругаться NotImplementException();

Это студия сама мне с генерировала.

public override RelayCommand RelayCommand
        {
            get => throw new System.NotImplementedException();
            set => throw new System.NotImplementedException();
        }

Хочет что бы я что то в геттере и сеттере седлал но я не понимаю что. Не понимаю как выбраться из этой проблемы, я запутался. Может вообще все удалить и сделать по другому.

READ ALSO
Как портировать .net winforms на mac os?

Как портировать .net winforms на mac os?

Всем приветВозникла задача портировать одно моё приложение написанное на языке c# (на платформе

100
Не работает Binding у StackPanel

Не работает Binding у StackPanel

Не работает Binding у StackPanel

114
Ошибка в Rider при запуске, во время выполнения сихронизации шаблонов

Ошибка в Rider при запуске, во время выполнения сихронизации шаблонов

Пользуюсь Windows 7x64 UltimateХочу попробовать Jet Brains Rider но получаю постоянную ошибку при запуске постоянное зависание, причем на всех версиях Rider 2017-2018...

167
ClosedXML, как сделать перенос текста

ClosedXML, как сделать перенос текста

я знаю как сделать выравнивание текста слева на право workSheetColumns()

140