WPF: как вызвать функцию пользовательского UserControl в ViewModel - PullRequest
3 голосов
/ 14 февраля 2011

У меня есть пользовательский элемент управления, определенный с помощью WPF в независимой сборке. В другом проекте я просто ссылаюсь на него и использую его в XAML следующим образом:

<my:CustomUserControl Name="myControl" IsEnabled="{Binding CanTheUserInputTrade}"/>

Класс CustomUserControl имеет функцию-член под названием «Сброс».

Я вызывал эту функцию внутри файла View.xaml.cs, используя:

myControl.Reset()

Однако по уважительной причине я должен переместить логику вызова этой функции во ViewModel. Насколько я знаю, не рекомендуется ссылаться на представление в ViewModel. Поэтому я не смогу получить доступ к ссылке «myControl» из ViewModel.

Мой вопрос: как я могу вызвать функцию сброса в ViewModel.

Это общий случай использования, и я уверен, что есть способ сделать это. Может кто-нибудь указать мне правильное направление.

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

В прошлом я подключал событие из-за кода View.

ViewModel:

public ICommand ResetCommand {get; set;}

Из метода OnLoad UserControl:

private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
    MyUserControl ctrl = sender as MyUserControl;
    if (ctrl == null) return;

    MyViewModel vm = ctrl.DataContext as MyViewModel ;

    if (vm == null)
        return;

    vm.ResetCommand = new RelayCommand(param => this.Reset());
}
1 голос
/ 14 сентября 2016

@ Решение Рэйчел великолепно.Использование интерфейса делает его немного более свободным:

using System.Windows.Input;

namespace WpfApplication
{
    public interface IResetCaller
    {
        ICommand ResetCommand { get; set; }
    }
}

Пусть ваша базовая модель представления реализует этот интерфейс, например

public class MyViewModel : ModelBase, IResetCaller
{
    ...
    public ICommand RefreshSegmentCommand { get; set; }
}

И код Рэйчел становится:

Этот интерфейс может использоваться для украшения любого количества моделей представлений, и интерфейс может быть определен в той же библиотеке, что и UserControl.В основной ViewModel вы просто делаете что-то вроде ResetCommand.Execute(this) или любой другой параметр, который вы хотите передать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...