2014-01-08 2 views
0

Поддерживает ли mvvmcross привязку к вложенным свойствам?Связывание суб-свойств MvvmCross

Например, у меня есть модель представления следующим образом:

class MainViewModel : MvxViewModel 
{ 
    public SubViewModelBase SubViewModel 
    { 
      get { return _subViewModel; } 
      set { _subViewModel = value; RaisePropertyChanged(() => SubViewModel); } 
    } 
} 

Суб вид модели может измениться, но MainView будет связываться с теми же свойствами, для всех классов SubViewModelBase ... класс пример SubViewModelBase следующим :

class SubViewModelBase : MvxViewModel 
{ 
    public bool ShowIndeterminantProgress 
    { 
      get { return _showIndeterminantProgress; } 
      set { _showIndeterminantProgress = value; RaisePropertyChanged(() => ShowIndeterminantProgress);} 
    } 

    // ... More common properties ... 
} 

Так MainView идеале связывать как это

  this.CreateBinding(_progressBar) 
     .For(view=> view.Visibility) 
     .To<MainViewModel>(vm => vm.SubViewModel.ShowIndeterminantProgress) 
     .WithConversion("Visibility") 
     .Apply(); 

Должна ли эта работа? Кажется, что он работает, но в выходе нет ошибок привязки?

ответ

3

Поддерживает ли mvvmcross привязку к вложенным свойствам?

Да

Должен ли эта работа?

Да

Например, эта строка в ApiExamples для Xamarin.iOS работает:

 set.Bind(errorLabel2).To(vm => vm.Errors.Count); 

https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/ApiExamples/ApiExamples.Touch/Views/FirstView.cs#L361

Набор поддерживаемых функций описан в https://github.com/MvvmCross/MvvmCross/wiki/Databinding#fluent - но по общему признанию, этот плавное связывание больше установлено/используется в Xamarin.iOS, чем в Wpf.


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

private Visibility _mockVisibility; 
public Visibility MockVisibility 
{ 
    get 
    { 
     return _mockVisibility; 
    } 
    set 
    { 
     Debug.WriteLine("MockVisibility called with " + value); 
     _mockVisibility = value; 
    } 
} 

и связывание это как:

this.CreateBinding(this) 
    .For(view=> view.MockVisibility) 
    .To<MainViewModel>(vm => vm.SubViewModel.ShowIndeterminantProgress) 
    .WithConversion("Visibility") 
    .Apply(); 

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

Помимо этого:

  • вы также можете попробовать связывание текста метки, чтобы увидеть, что это показывает.
  • вы также можете попробовать настройки привязки уровень трассировки диагностики (с использованием статического поля MvxBindingTrace.TraceBindingLevelhttps://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding/MvxBindingTrace.cs#L14)
  • попытаться изолировать проблему по частям (изолирующий преобразователь, изолируя вложенное свойство, и т.д., и т.д.) - я думаю это это то, что вы уже делаете, задавая этот вопрос.
+0

Спасибо, Стюарт. Так что это работает, вы правы.У свойства, которое, как представляется, возникает проблема, является свойство Pressed [link] http://stackoverflow.com/questions/17926975/android-view-states-pressed-activated-selected-etc-bindings-do-i-have- to-wr, связанный в subviewmodel (на Android). Я продолжу смотреть на это, отладчик попадает в getter свойства, но сеттер никогда не попадает, даже когда я использую двухсторонний режим. Но другие вложенные свойства работают так, как я ожидал. Благодаря! – AlexUT

Смежные вопросы