Предотвращение массового распространения свойств и событий для показа в ViewModels - PullRequest
2 голосов
/ 14 июня 2010

У меня есть приложение MVVM, которое я разрабатываю до такой степени, что я готов начать собирать пользовательский интерфейс (мой клиентский код в значительной степени функционален)

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

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

Позвольте мне привести несколько примеров моей проблемы:

У меня есть класс «Unit», содержащийся в классе «Test», содержащийся в классе «Session», который содержится в классе «TestManager», который содержится в «TestDataModel», который используется «TestViewModel», который связан с данными моим "TestView" .... WHOA.

Теперь рассмотрим, что у Unit (нижняя часть иерархии) есть свойство с именем «Results», которое периодически обновляется, я хочу показать это моей модели представления, а затем привязать ее к моему мнению, проблема в том, что единственный способ, которым я действительно можно подумать, чтобы сделать это, чтобы увековечить события WAY вверх по цепочке, которая говорит: «Я был обновлен!» и затем запросите новое значение ... Это кажется ужасным способом сделать это. В качестве альтернативы, я мог бы зарегистрировать статическое событие и вызвать его, и сделать так, чтобы соответствующая «Модель представления модуля» получила событие и запросила обновление. Это кажется лучше ... но ... статические события? Это запретная идея?

Также, имея выражение вроде:

TestDataModel.TestManager.Session.Test.Unit.Results[i] Seems REALLY gross to have on a View Model.  

Я знаю, что все это пахнет плохим дизайном, но я не могу понять, что я сделал не так? Должен ли я использовать больше объектов с однократным / контейнерным временем жизни? Зарегистрировать экземпляры объектов в статических вспомогательных контейнерах? Может быть, Мультитон? Очевидно, что это трудные вопросы, на которые нужно ответить, не будучи тесно знакомыми с существующей структурой, но если вы столкнулись с такими ситуациями, что вы сделали для рефакторинга? Должен ли я просто жить с этим, добавлять массовые мероприятия и распространять их?

Ответы [ 3 ]

4 голосов
/ 14 июня 2010

Проблема в том, что ваш TestView пытается узнать все о вашей модели. В действительности вы хотите иметь простые представления и использовать композицию, чтобы объединить их в более сложные. Таким образом, у вас будет представление, которое просто имеет дело с единицами и ничем иным (другие представления будут иметь дело с другими аспектами вашей большой модели). Таким образом, ваши модели представления будут получать доступ к модели через четко определенный API (например, чтобы получить единицы и т. Д. .) и не будет необходимости нарушать инкапсуляцию вашей модели, предоставляя доступ ко всем ее внутренним элементам.

0 голосов
/ 14 июня 2010

Вам нужны события пользовательского интерфейса (не обязательно INotifyPropertyChanged), чтобы указать, когда результаты были обновлены.Prism включает агрегатор событий, если вы хотите его использовать, или вы можете получить его, используя пользовательские события C # для вашего объекта модели.

Я не рекомендую реализовывать INotifyPropertyChanged для вашего объекта модели;используйте что-то более конкретное, например,

public event Action ResultsChanged

После того, как вы настроили какую-либо систему событий, затем в вашей ViewModel подключитесь к событию Model и запускайте событие PropertyChanged при каждом изменении результатов.Не стесняйтесь создавать больше классов ViewModel (по одному ViewModel на Result), если они необходимы для работы кода привязки данных.

0 голосов
/ 14 июня 2010

Если ваши модели представления поддерживают уведомление (например, через INotifyPropertyChanged), то регулярное связывание данных в вашем представлении будет означать, что представление обновляется само. Может я что-то упускаю в вопросе?

Обновление

Если вас интересует цепочка свойств, то у вас может быть модель ResultsViewModel, которая предоставляет результаты, а затем привязывает ваш вид к результатам. Результаты должны быть наблюдаемой коллекцией, и каждый Результат должен реализовывать INotifyPropertyChanged. Я предполагаю, что ваше представление отображает список результатов.

...