2013-09-01 1 views
2

У меня возникли проблемы с обновлением списка горизонтальных списков сырых баров на новый v3 MvvmCross. Кажется, что все работает правильно, за исключением того, что в конструкторе моего элемента управления BindableHorizontalListView элемент ItemsSource имеет значение NULL. Что странно, потому что контекст показывает, что свойство view-model, которое я пытаюсь связать, показывает очень четко, что есть 3 элемента, и привязка кажется очень простой. Что мне не хватает? Надеюсь, я включил достаточно кода. Я также попытался связать его с помощью быстрых привязок в событии «OnViewModelSet» с тем же результатом.ItemsSource пуст в конструкторе Custom Bound Horizontal ScrollView

Предупреждение представил

[MvxBind] 24.87 Unable to bind: source property source not found Cirrious.MvvmCross.Binding.Parse.PropertyPath.PropertyTokens.MvxPropertyNamePropertyToken on DeviceViewModel 

AXML

<BindableHorizontalListView 
     android:id="@+id/listView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     local:MvxBind="ItemsSource DevicesList; ItemClick ItemSelected" 
     local:MvxItemTemplate="@layout/devices_horizontal_list_item" /> 

управления BindableHorizontalListView

using System.Collections; 
using System.Windows.Input; 
using Android.Content; 
using Android.Util; 
using Cirrious.MvvmCross.Binding.Attributes; 
using Cirrious.MvvmCross.Binding.Droid.Views; 

namespace Project.Droid.Controls 
{ 
    public class BindableHorizontalListView 
     : HorizontalListView //Which inherits from AdapterView<BaseAdapter> 
    { 
     public BindableHorizontalListView(Context context, IAttributeSet attrs) 
      : this(context, attrs, new MvxAdapter(context)) 
     { 
     } 

     public BindableHorizontalListView(Context context, IAttributeSet attrs, MvxAdapter adapter) 
      : base(context, attrs) 
     { 
      InitView(); 
      var itemTemplateId = MvxAttributeHelpers.ReadListItemTemplateId (context, attrs); 

      adapter.ItemTemplateId = itemTemplateId; 
      Adapter = adapter; 
      SetupItemClickListener(); 

     } 

     public new MvxAdapter Adapter 
     { 
      get { return base.Adapter as MvxAdapter; } 
      set 
      { 
       var existing = Adapter; 
       if (existing == value) 
        return; 

       if (existing != null && value != null) 
       { 
        value.ItemsSource = existing.ItemsSource; 
        value.ItemTemplateId = existing.ItemTemplateId; 
       } 

       base.Adapter = value; 
      } 
     } 

     [MvxSetToNullAfterBinding] 
     public IEnumerable ItemsSource 
     { 
      get { return Adapter.ItemsSource; } 
      set { Adapter.ItemsSource = value; this.Reset(); } 
     } 

     public int ItemTemplateId 
     { 
      get { return Adapter.ItemTemplateId; } 
      set { Adapter.ItemTemplateId = value; } 
     } 

     public new ICommand ItemClick { get; set; } 

     private void SetupItemClickListener() 
     { 
      base.ItemClick += (sender, args) => 
      { 
       if (null == ItemClick) 
        return; 
       var item = Adapter.GetItem(args.Position) as Java.Lang.Object; 
       if (item == null) 
        return; 

       if (item == null) 
        return; 

       if (!ItemClick.CanExecute(item)) 
        return; 

       ItemClick.Execute(item); 
      }; 
     } 
    } 
} 

Посмотреть

[Activity (Label = "Device", ScreenOrientation = ScreenOrientation.Portrait)] 
public class DeviceView : MvxActivity 
{ 

    protected override void OnCreate (Bundle bundle) 
    { 
     base.OnCreate (bundle); 
     SetContentView(Resource.Layout.device); 
    } 

} 

собственности на ViewModel

private Services.Device[] _devicesList; 
public Services.Device[] DevicesList { 
    get { 
     return _devicesList; 
    } 
    set { 
     _devicesList = value; 
     RaisePropertyChanged(() => DevicesList); 
    } 
} 

Если только там была PCL поддержка в XAM STUDIO я бы просто шаг и посмотреть, как другие элементы управления делают это !!!!

ответ

2

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

Сообщение:

[MvxBind] 24.87 Unable to bind: source property source not found Cirrious.MvvmCross.Binding.Parse.PropertyPath.PropertyTokens.MvxPropertyNamePropertyToken on DeviceViewModel 

содержит ошибку - исправлена ​​ошибка в a recent commit - так что сообщение должно быть более удобным для чтения в будущем.

Если ошибка не была там, я подозреваю, что сообщение скажет, что проблема в DevicesList - привязка не может найти это свойство. Это там? Есть ли у него get? Это public?

+0

Благодарим за помощь! Добавлен код DeviceList на вопрос, и для меня это выглядит просто, но я новичок во всем этом волшебстве MVVM. –

+0

Это не «волшебство» - это код и нормальное развитие. Я рекомендую вам сначала запустить его с обычным списком - просто переключитесь, перестройте все и заставьте его работать со стандартным списком, затем переключитесь на горизонтальный список и отлаживайте его. – Stuart

+0

Я связал множество списков и только что закончил писать одно и то же приложение на iPhone. Я уверен, что это глупая ошибка, я расскажу миру, когда найду ее. Спасибо за помощь. Полезно знать об ошибке, теперь, если бы я мог самостоятельно построить mvvmCross PCL на Xam.Studio, это было бы здорово. –

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