Свойство DependencyProperty для представления twoway-bind для свойства viewmodel?

Несколько источников в сети говорят нам, что в MVVM связь / синхронизация между представлениями и режимами просмотра должна происходить через свойства зависимостей. Если я правильно понимаю это, свойство зависимостей представления должно быть привязано к свойству viewmodel с использованием двусторонней привязки. Теперь аналогичные вопросы задавали раньше, но без достаточного ответа.

Прежде чем я начну анализировать эту довольно сложную проблему, вот мой вопрос:

Как синхронизировать DependencyProperty настраиваемого вида с свойством viewmodel?

В идеальном мире вы просто привязываете его как это:

  

Это не работает, поскольку MyProperty не является членом UserControl . Doh! Я пробовал разные подходы, но ни один из них не оказался успешным.

Одним из решений является определение базового classа UserControlEx с необходимыми свойствами зависимостей, чтобы заставить выше работать. Однако это скоро становится крайне беспорядочным. Не достаточно хорош!

Я использую Caliburn.Micro для разделения ViewModel из представления. Тем не менее, это может работать в MVVM одинаково. Я полагаю, MVVM устанавливает свойство DataContext представления в экземпляр ViewModel.

ПОСМОТРЕТЬ

 // in the class of the view: MyView public string ViewModelString // the property which stays in sync with VM's property { get { return (string)GetValue(ViewModelStringProperty); } set { var oldValue = (string) GetValue(ViewModelStringProperty); if (oldValue != value) SetValue(ViewModelStringProperty, value); } } public static readonly DependencyProperty ViewModelStringProperty = DependencyProperty.Register( "ViewModelString", typeof(string), typeof(MyView), new PropertyMetadata(OnStringValueChanged) ); private static void OnStringValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { // do some custom stuff, if needed // if not, just pass null instead of a delegate } public MyView() { InitializeComponent(); // This is the binding, which binds the property of the VM // to your dep. property. // My convention is give my property wrapper in the view the same // name as the property in the VM has. var nameOfPropertyInVm = "ViewModelString" var binding = new Binding(nameOfPropertyInVm) { Mode = BindingMode.TwoWay }; this.SetBinding(SearchStringProperty, binding); } 

В.М.

 // in the class of the ViewModel: MyViewModel public string ViewModelStringProperty { get; set; } 

Обратите внимание, что такой вид реализации полностью не реализует интерфейс INotifyPropertyChanged . Вам нужно будет обновить этот код правильно.

Если вы хотите сделать это в XAML, вы можете попробовать использовать стили для достижения этого.

Вот пример:

       

В вашем случае и MyViewProperty и MyViewModelProperty будут называться MyProperty но я использовал разные имена, чтобы просто понять, что это такое.

Допустим, вы определили Dep DependropProperty Depup в представлении и хотите использовать точно такое же значение в вашей ViewModel (которое реализует INotifyPropertyChanged, но не DependencyObject). Вы должны иметь возможность сделать следующее в своем XAML:

      ...   
  • Свойства vs Методы
  • Являются ли функции get и set популярными у программистов на C ++?
  • Ошибка в classе Swift: свойство не инициализировано при вызове super.init
  • Когда использовать val или def в чертах Scala?
  • 'свойство: 0' или 'свойство: 0px' в CSS?
  • Аутентифицированная среда равна нулю
  • Миксины против черт
  • Создайте массив свойств целых чисел в Objective C
  • Как избежать знака равенства в файлах свойств
  • Когда для доступа к свойствам с помощью «self»
  • Общаться между двумя windowsми в C #
  • Давайте будем гением компьютера.