WPF MVVM Измените модель

1

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

XAML привязывается к обоим свойствам в модели представления, а также к свойствам в переданных данных.

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

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

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

<MyControl Source="{Binding Data}"/>

Где источник - свойство зависимостей MyControl. В PropertyChangedCallback эти данные передаются модели представления.

MyViewModel.Data = Source;

Внутри объекта MyControl XAML привязаны к этой модели.

{Binding Path=MyViewModel.Data.Item}

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

  • 0
    Вы пытаетесь обменять DataContext пользовательского контроля во время сеанса приложения? Если да, то я вполне уверен, что это не сработает.
  • 0
    @ScottNimrod ScottNimrod Я прокомментировал ваш ответ.
Теги:
xaml
wpf
user-controls
mvvm

2 ответа

1
Лучший ответ

"UserControl поддерживается моделью просмотра" и, таким образом, прерывает приложение.

Элемент UserControl DataContext должен быть моделью. Период. Если вам нужно выполнить логику пользовательского интерфейса, сделайте это в коде. Нужно что-то еще? Создайте DependencyProperties на поверхности вашего UserControl для их доставки.

Когда вы создаете ViewModel специально для вашего UserControl, вы нарушаете естественный поток DataContext (на данный момент, возможно, модель UC предназначена для работы) и привязки в UserControl. В большинстве случаев это бессмысленно и вредно для некоторых (как вы заметили).

Мой канонический ответ на эту тему содержит более подробную информацию.

0

Вы пытаетесь заменить DataContext пользовательского контроля во время сеанса приложения?

Если да, то я уверен, что это не сработает.

Вы рассматривали возможность создания нового экземпляра этого пользовательского элемента управления с помощью другого DataConext?

  • 0
    "Вы пытаетесь обменять DataContext?" Не совсем. Элемент управления наследует контекст данных, так что связывание с точки зрения пользователя работает (пользователь является разработчиком, использующим UserControl). Раскрутка нового экземпляра не вариант, потому что это то, что пользователь UserControl должен был бы сделать. Подумайте о ситуации, когда я делаю пользовательский элемент управления похожим на список и хочу, чтобы пользователь мог изменять список, с которым связан элемент управления.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню