Селектор пользовательского управления WPF [дубликат]

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

Объявление высоты строки: нормальные не только меняются от браузера к браузеру, который я ожидал - на самом деле, количественно эти различия были целыми, но они также варьировались от одного шрифта до другого, а также могут варьироваться в пределах определенного лица.

1
задан cederlof 28 March 2013 в 12:53
поделиться

1 ответ

Слишком долго для комментария.

Основываясь на том, что @Kent изложил в вашем комментарии, весь смысл MVVM заключается в том, чтобы отключить модель представления из связанных с просмотром материалов (элементов управления), которая блокирует тестирование возможности графических приложений. Таким образом, у вас есть элемент UserControl / Button / whatever, связанный с графическим представлением, полностью исключает весь принцип MVVM.

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

  1. С MVVM у вас обычно есть 1 view & lt; -> 1 view-model
  2. View знает о своей модели просмотра (обычно через DataContext). Реверс не должен быть закодирован.
  3. Вы пытаетесь поместить логику, управляющую представлением в модели представления, чтобы разрешить логику тестирования (команды и свойства INPC)

.. и еще немало. Это довольно специфично в экстентах модели представления, не имеющих связанных с просмотром материалов, например, даже не имеющих свойств в виде-модели, подобных Visibility. Обычно вы держите bool, а затем в представлении используйте конвертер, чтобы переключить его на объект Visibility.

Чтение немного больше в MVVM, безусловно, поможет вам,

Теперь для решения вашей текущей проблемы:

После структуры MVVM,

у вас будут ViewModels, такие как

  • Main: MyViewModel
  • Вывести все экземпляры ViewModels из базы, чтобы они содержались в списке.
  • Список или удерживать отдельно Instance1ViewModel, Instance2ViewModel, Instance3ViewModel в MyViewModel (Либо создайте его самостоятельно, либо если вы используете контейнер IOC, пусть он его введет)
  • Уделите MyViewModel свойство, подобное вашему опубликованному примеру:

Пример:

// ViewModelBase is the base class for all instance View Models
private ViewModelBase _currentFrame;
public ViewModelBase CurrentFrame {
  get {
    return _currentFrame;
  }

  private set {
    if (value == _currentFrame)
      return;
    _currentFrame = value;
    OnPropertyChanged(() => CurrentFrame);
  }
}
  • Теперь в вашем файле MyView.xaml View вы должны (не должен быть верхнего уровня) установить верхний уровень DataContext на ваш MyViewModel
  • Затем xaml вашего представления можно объявить следующим образом:

Пример:

...
<Window.Resources>
  <DataTemplate DataType="{x:Type local:Instance1ViewModel}">
    <local:Instance1View />
  </DataTemplate>
  <DataTemplate DataType="{x:Type local:Instance2ViewModel}">
    <local:Instance2View />
  </DataTemplate>
  <DataTemplate DataType="{x:Type local:Instance3ViewModel}">
    <local:Instance3View />
  </DataTemplate>
</Window.Resources>
<Grid>
  <ContentControl Content="{Binding Path=CurrentFrame}" />
</Grid>
...
  • Thats it !. Теперь вы просто переключаете свойство CurrentFrame в своей модели представления и указываете на любую из трех моделей экземпляров экземпляра, и представление будет соответствующим образом обновлено.

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

1
ответ дан Community 15 August 2018 в 23:07
поделиться
  • 1
    Спасибо за подробный ответ! Я все это понимаю, и это была моя первая попытка исправить это - используя View как DataTemplate для ViewModel. Тем не менее, в представлении я привязываю VisualStates к свойствам ViewModel, и когда я переключу ViewModel на мой ContentControl на другую виртуальную машину и затем переключая ее обратно, я, кажется, имею два экземпляра View в памяти, причем оба они имеют их ViewState связан с моей ViewModel. Каждый раз, когда я повторно привязываю ContentControl, он создает новый экземпляр представления. – cederlof 29 March 2013 в 22:24
  • 2
    Я не могу найти решение, где я бы получил экземпляр same View, используемый внутри ContentControl. То когда я попытался связать экземпляр вида к ContentControl, вместо ViewModel - и так - нарушая MVVM-шаблон. – cederlof 29 March 2013 в 22:25
  • 3
    @cederlof Нет проблем. Я получаю вашу проблему с сохранением представлений, переключая их из модели представления. Вы посмотрели ссылку на последний параграф моего сообщения. Это вопрос, подобный вашему, с некоторыми полезными ответами. Вы можете попробовать пример Rachael и применить его к своему контейнеру, чтобы получить свое требование и не нарушать принципы MVVM. Попробуйте, если у вас нет, как кажется, эффективно решить проблему – Viv 29 March 2013 в 22:35
  • 4
    Благодаря! Однако эти решения, похоже, не работают для меня, поскольку я хотел бы использовать один и тот же экземпляр View внутри другого ContentPresenter-control, перемещая его из одного ContentPresenter в другой. Извините, мой вопрос не совсем ясен ... – cederlof 8 April 2013 в 10:07
Другие вопросы по тегам:

Похожие вопросы: