Silverlight DataForm, MVVM, объект IEditable и пользовательский шаблон EditTemplate. Как выполнить пользовательскую проверку грязного состояния - PullRequest
0 голосов
/ 27 августа 2011

У меня есть интересная проблема с Silverlight DataForm и дочерними коллекциями. У меня также есть решение, которое работает, но оно похоже на взлом (это - это взлом), и мне было интересно, есть ли у кого-нибудь более элегантное решение.

У меня есть DataForm, привязанная к коллекции GroupViewModels. У каждой GroupViewModel есть ObservableCollection UserViewModels, которые я хотел бы, чтобы пользователь мог добавлять и удалять при отображении EditTemplate DataForm.

Пользовательский интерфейс для этого - простой ComboBox со списком всех пользователей и ListBox пользователей, которые в настоящее время находятся в группе. Для перемещения пользователя из одного списка в другой есть кнопка добавления и удаления.

Теперь ... модель представления, к которой привязана DataForm, реализует IEditableObject, .. это здорово, потому что я получаю поведение отката, если редактирование отменено, но в этом случае этого недостаточно. Мне нужен способ сообщить DataForm, находится ли моя виртуальная машина в грязном состоянии или нет.

Так как мой ViewModel имеет свойство SelectedUserToAdd, с которым связан SelectedItem всех пользователей ComboBox, когда пользователь выбирает пользователя для добавления, событие PropertyChanged запускается на моей виртуальной машине, и DataForm думает, что что-то изменилось и фиксирует ( ОК) кнопка загорается. Он также загорается при изменении выделения в ListBox из-за свойства SelectedUserToRemove.

Очевидно, что я хочу, чтобы кнопка фиксации загорелась, если изменились UserViewModels в ListBox.

Решение простое. Я могу остановить подсветку кнопки фиксации, если удаляю уведомление об изменении из свойств SelectedUserToAdd и SelectedUserToRemove и могу получить кнопка commit для включения подсветки с использованием фиктивного свойства Dirty, которое вызывает NotifyPropertyChanged при срабатывании команды AddUser или DeleteUser.

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

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

1 Ответ

1 голос
/ 27 августа 2011

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

Я могу рассказать вам о способе заставить форму данных «игнорировать» (не совсем) определенные уведомления о свойствах.Что вы можете сделать, это проверить, было ли задано определенное свойство, и если это свойство должно быть проигнорировано, вы вручную игнорируете сброс кнопки фиксации до ее предыдущего состояния:

        someViewModel.PropertyChanged += (sender, e) =>
                                             {
                                                 Grid dependencyObject = VisualTreeHelper.GetChild(TheDataForm, 0) as Grid;
                                                 var commitButton = dependencyObject.FindName("CommitButton") as Button;
                                                 commitButton.IsEnabled = !e.PropertyName.Equals("PropertyToIgnore");
                                             };

Затем вы можете настроить его, наследуя от формы данныхи создание свойства зависимости, в котором вы можете привязать свойства к игнорированию.

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

...