У меня есть интересная проблема с 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.
Как я уже сказал, .. это работает, но кажется неправильным. У кого-нибудь есть идея получше?
Большое спасибо заранее.