2015-03-29 2 views
3

Я разрабатываю приложение WPF в MVVM Patern. Приложение имеет панель команд и кнопки для сохранения и удаления записей.WPF MVVM Выполнение различных действий на основе сфокусированного объекта

enter image description here

Приложение также имеет Master Detail форму. Это пользовательский элемент управления и DataGrid.

  • Мастер блок: Заказ клиента

  • Подробный блок: заказ клиента Линии

    (один ко многим отношений).

Проблема:

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

Для примера, если я нажму на кнопку Удалить

  1. Он должен удалить записи только в DataGrid строке, когда DataGrid имеет фокус и ряд (ы) выбранного. . Удалить метод DeleteRows().

  2. Он должен удалить всю запись, если основной блок имеет фокус, а не фокус с привязкой данных. . Удалить метод DeleteRecord().

Насколько я знаю, я могу достичь этого с помощью фокуса клавиатуры и логического фокус-менеджера. Но я не смог найти правильное решение. Я должен учитывать, что при нажатии кнопки удаления я должен игнорировать фокус кнопки «Удалить».

Пожалуйста, помогите мне преодолеть эту проблему с помощью примерного кода.

+1

Просто мысль: вы уверены, что это будет хорошо спроектированный пользовательский интерфейс? Поведение, которое вы описали, похоже, не настолько прозрачно и интуитивно понятно для пользователя. – dymanoid

+0

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

+0

Ну, тот факт, что это уже реализовано где-то, не означает, что это хорошее решение. Я бы очень сговорился, если одна кнопка ** Удалить ** в командной строке удалит данные в зависимости от того, где курсор клавиатуры мигает ... В любом случае, это зависит от вас. – dymanoid

ответ

0

Поскольку вы используете шаблон MVVM, я предполагаю, что ваши кнопки в командной строке имеют соответствующие ICommand s в модели представления.

Вы можете связать свой DataGrid свойства SelectedItem с видом на собственность модели (разумеется, с двусторонней привязкой) и принять это решение в соответствии с этим значением свойства. Если это null, значит, в DataGrid нет элемента, и вы можете удалить всю запись. Если он установлен в экземпляр, то строка выбирается в DataGrid, и вы можете удалить только одну строку.

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

enum LastFocusedEntityType { None, Record, Row } 

class LastFocusedEntityTrackingBehavior : Behavior<UIElement> 
{ 
    public static readonly LastFocusedEntityProperty = DependencyProperty.Register(
     "LastFocusedEntity", 
     typeof(LastFocusedEntityType), 
     typeof(LastFocusedEntityTrackingBehavior), 
     LastFocusedEntityType.None); 

    public LastFocusedEntityType LastFocusedEntity 
    { 
     get { return (LastFocusedEntityType)this.GetValue(LastFocusedEntityProperty); } 
     set { this.Setvalue(LastFocusedEntityProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     Keyboard.AddPreviewLostKeyboardFocusHandler(this.AssociatedObject, this.PreviewLostKeyboardFocusHandler); 
    } 

    private void PreviewLostKeyboardFocusHandler(object sender, KeyboardFocusChangedEventArgs e) 
    { 
     if (e.OldFocus is DataGrid) 
     { 
      this.LastFocusedEntity = LastFocusedEntityType.Row; 
     } 
     else 
     { 
      this.LastFocusedEntity = LastFocusedEntityType.Record; 
     } 
    } 
} 

Затем вы можете применить это поведение вашего основного блока контейнер:

<UserControl> 
    <i:Interaction.Behaviors> 
     <local:LastFocusedEntityTrackingBehavior LastFocusedEntity="{Binding LastFocusedEntity, Mode=OneWayToSource}"/> 
    </i:Interaction.Behaviors> 
</UserControl> 

В вашей модели представления, ваши ICommand «ы Execute() метода должны затем посмотреть на значении LastFocusedEntity имущества и решить, что делать следующий.

Примечание: Я не проверял этот код, не компилируется ли он.

+0

Спасибо @dymanoid. Никакого успеха с кодом, который вы предоставили. Это не компиляция :(. – Rahul

Смежные вопросы