Нужно вызвать метод VIewModel из View - PullRequest
0 голосов
/ 15 декабря 2010

Привет Я хотел знать, правильный ли этот подход, или какой должен быть правильным У меня есть шаблон MVVM, и у меня есть ListView моя идея состоит в том, что когда я выбираю элемент в виде списка, свойство в модели представления обновляется с выбранным объектом. Однако, когда пользователь нажимает Intro, я хочу, чтобы viewmodel что-то сделала (откройте новое окно браузера). Я сделал что-то вроде этого:

private void listView1_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            var vm = Resources["Locator"] as MainViewModel;

            if (listView1.SelectedIndex != -1 && e.Key == Key.Enter)
            {
                vm.OpenBrowserForSelectedOffer();
            }
        }

Однако я не знаю, является ли это правильным способом, чтобы все было хорошо сделано, или нужно что-то еще делать. Поскольку в этом случае представление фактически запрашивает модель представления (которая является ресурсом), возможно, она «слишком много знает» об этом, и существует лучшая практика для решения такого рода проблем.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

Я предполагаю, что вы используете WPF или Silverlight.Использование шаблона команды, конечно, является правильным способом выполнения команды, инициируемой событием пользовательского интерфейса.Но проблема в том, что в вашем случае эта операция сама по себе что-то делает с пользовательским интерфейсом;и это не ответственность модели представления.

Это может быть решено простым способом, так что модель представления остается тестируемой.Создайте интерфейс IBrowserService с операцией OpenBrowserForOffer.

public void OpenBrowserForOffer(Offer offer, Action<Result> callback)

Создайте одну его реализацию, которая откроет браузер и отобразит выбранное предложение.Создайте другую реализацию, которая является фиктивной реализацией без UI.

Затем из viewmodel вставьте экземпляр IBrowserService и используйте его, чтобы открыть браузер или выполнить фиктивную логику, в зависимости от запуска из реального приложенияtest.

Обратите внимание, что в представлении у вас есть DataContext, чтобы получить модель представления.

2 голосов
/ 15 декабря 2010

Не совсем понятно, что делает OpenBrowserForOffer, но я предполагаю, что он открывает новое окно браузера (используя, например, Process.Start()) для этого предложения, верно?

Если так, то я думаю, что совершенно нормально для модели представления, чтобы справиться с этим, так как это часть бизнес-логики.

И для представления нет проблем узнать или предположить что-то о модели представления, она все равно это делает (поскольку вы привязываетесь к ее свойствам).

И, как предлагается в другом ответе, вы можете легко получить текущую модель представления вашего представления, посмотрев на DataContext. В представлениях, где мне нужен доступ к коду модели представления, я обычно реализую два свойства для удобства:

private YourViewModelType ViewModel
{
    get { return DataContext as YourViewModelType; }
}

private bool HasViewModel { get { return ViewModel != null; } }
1 голос
/ 15 декабря 2010

Используйте команду в Viewmodel, которая привязана к KeyDown-Event / Command для listView, и переместите код в команду внутри viewmodel, вуаля, вы получили чистый шаблон mvvm.

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