Вызов метода UserControl в MVVM - PullRequest
       4

Вызов метода UserControl в MVVM

9 голосов
/ 14 сентября 2010

У меня проблема с вызовом метода в UserControl.Выслушайте меня:

  1. У меня есть UserControl someControl в SomeView.xaml

  2. DataContext SomeView.xaml - SomeViewModel.cs

  3. Я хочу иметь возможность вызывать someControl.DoStuff() как угодно, где-нибудь.

  4. DoStuff не зависит от пользовательского интерфейса (я мог просто вызвать DoStuff из кода- за SomeView.Xaml.Cs, если это было специфично для пользовательского интерфейса, но в данном случае это может быть не так.)

Есть идеи?

Спасибо!

Ответы [ 7 ]

5 голосов
/ 14 сентября 2010

Вам, вероятно, не понравится ответ, но ваша ViewModel не должна знать ваш пользовательский интерфейс. Если в вашем UserControl есть метод, не связанный с пользовательским интерфейсом, он, вероятно, находится не в том месте.

Единственное, о чем я могу подумать, это то, что вы можете захотеть внедрить какой-либо тип сообщений (как они есть в MVVM Light ), которые могут инициировать выполнение.

Это либо так, либо переосмыслите то, как вы спроектировали свой код.

3 голосов
/ 08 октября 2014

Один SO-ответ для получения этого путем разделения знаний ViewModel о View равен с использованием делегатов Action , на которые Mert здесь

Вставил свой код сюда, если ссылка случайно сломалась.

class MyCodeBehind
{
   public MyCodeBehind()
   {
      Action action = new Action(()=> this.SomeMethodIWantToCall());
      var myVM = new MyVM(action); // This is your ViewModel
      this.DataContext = myVM;
   }

   private void SomeMethodIWantToCall(){...}
}

class MyVM
{
    private Action action;

    public MyVM(Action someAction)
    {
       this.action = someAction;
    }

    private void SomeMethodInVM()
    {
        this.action(); // Calls the method SomeMethodIWantToCall() in your code behind
    }
}
3 голосов
/ 14 сентября 2010

Звучит так, как будто вы хотите, чтобы DoStuff происходил в ответ на некоторые данные или логику в вашей виртуальной машине, и в этом случае самым чистым методом, вероятно, было бы использование события, возникающего в вашей виртуальной машине и обрабатываемого DoStuff.Если триггер больше похож на изменение состояния, вы также можете привязать соответствующие данные виртуальной машины к новому свойству зависимости в вашем UserControl и вызвать DoStuff из обработчика изменений DP.

0 голосов
/ 29 сентября 2010

Если метод DoStuff ();выполняет определенную логику пользовательского интерфейса, тогда метод находится в нужном месте.В противном случае он должен быть в другом объекте (например, SomeViewModel).

SomeViewModel разрешено вызывать метод SomeView, когда он разделен через интерфейс.Как это можно сделать, показано в WPF Application Framework (WAF) .

0 голосов
/ 28 сентября 2010

Если у вас есть подход View-first (и ваша виртуальная машина создается как ресурс в XAML), вы можете использовать некоторые обычные события, чтобы связать ваш управляющий метод DoStuff с некоторым событием на виртуальной машине (на событии Loaded).

0 голосов
/ 28 сентября 2010

Может быть, ваш UserControl действительно должен быть View, который затем должен иметь ViewModel, который будет содержать метод DoStuff (). SomeViewModel будет создан (или, как минимум, используется для создания экземпляра) SomeControlViewModel, и поэтому сможет вызывать метод для него.

0 голосов
/ 14 сентября 2010

В дизайне MVVM идея, как правило, заключается в том, чтобы не иметь ЛЮБОГО кода в вашем UserControl (файл xaml.cs) (в идеальном мире). Все взаимодействие между пользовательским интерфейсом и ViewModel должно обрабатываться с помощью команд и привязок ... так зачем вам нужен DoStuff в вашем пользовательском элементе управления?

У вас может быть что-то вроде

<Button Command="{Binding myCommandOnTheDataContextViewModel}" Content="{Binding somePropertyOnTheViewModel}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...