MVVM Какой способ обновления пользовательского интерфейса после команды? - PullRequest
4 голосов
/ 24 августа 2009

Я изучаю MVVM через проект, и я застрял на чем-то простом.

У меня есть Button, который обновляет ListView. У меня есть command в ViewModel, которая делает правильные вещи, но я хочу выбрать новую строку и получить фокус на TextBox после того, как я нажму Button.

Вопрос в том, как обновить пользовательский интерфейс после выполнения команды?

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

Спасибо.

Ответы [ 5 ]

2 голосов
/ 25 августа 2009

Чтобы выбрать новую строку, добавьте новое свойство в свою ViewModel (например, «SelectedItem») и привяжите к нему свойство SelectedItem ListView:

<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">...

В ViewModel вам просто нужно назначить новый элемент свойству SelectedItem

Чтобы сфокусировать TextBox, идея Майка кажется хорошей

1 голос
/ 25 августа 2009

Вы можете сделать прикрепленное поведение. Я бы предложил использовать новую среду поведения Blend, то есть TriggerAction, которая содержала эту пользовательскую логику.

Для прикрепленного поведения вы надеваете кнопку, назначаете ей DP для ICommand и, возможно, DP типа ListView.

В «Invoke защищенного переопределения void (параметр объекта)» вашего TriggerAction выполните ICommand, после чего у вас будет ссылка на ваш ListView. Здесь вы можете сделать свой собственный код, например, установить фокус.

Ваш XAML может выглядеть примерно так:

<Button>
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="Click">
         <Behaviors:CustomBehavior Command="CommandName" ListView="{Binding ElementName=myListView}" />
      </i:EventTrigger>
   </i:Interaction.Triggers>
<Button/>

Я предлагаю посмотреть на поведение ExecuteCommandAction Майка Брауна ( скачать здесь ), это примерно половина того, что вам нужно.

0 голосов
/ 29 августа 2009

В вашем случае вам нужно каким-то образом, чтобы ViewModel уведомил View, что он должен установить фокус на конкретный элемент управления.

Это можно сделать с помощью интерфейса IView. Представление реализует этот интерфейс, и ViewModel может вызывать метод представления через этот интерфейс. Таким образом, вы по-прежнему не используете друг друга View и ViewModel.

Как это можно сделать, показано здесь:

WPF Application Framework (WAF)

http://waf.codeplex.com

0 голосов
/ 25 августа 2009

Я думаю, что вам нужно использовать шаблон Mediator.Пожалуйста, смотрите это:

Прототип посредника Джоша Смита для приложений WPF

Обычно используется для связи с представлением из модели представления.Надеюсь, это поможет.

0 голосов
/ 24 августа 2009

Как насчет установки фокуса для элемента управления в коде: textBox.Focus () Все, что вы упоминаете в своем вопросе, я считаю логикой графического интерфейса, поэтому я добавил бы к кнопке событие Click, чтобы обрабатывать вещи, которые должны происходить в графическом интерфейсе.

Надеюсь, это поможет.

...