2017-02-08 7 views
0

Я использую призму для разработки приложения Xamarin.Form. Я создаю пользовательский элемент управления карусельного:Как привязать список ViewModel к настраиваемому элементу управления?

public class CarouselLayout : ScrollView 
{ 
    public IList ItemsSource 
    { 
     get 
     { 
      return (IList)GetValue(ItemsSourceProperty); 
     } 
     set 
     { 
      SetValue(ItemsSourceProperty, value); 
     } 
    } 

    public static readonly BindableProperty ItemsSourceProperty = 
     BindableProperty.Create(
      nameof(ItemsSource), 
      typeof(IList), 
      typeof(CarouselLayout), 
      null, 
      propertyChanged: (bindableObject, oldValue, newValue) => 
      { 
       ((CarouselLayout)bindableObject).ItemsSourceChanged(); 
      } 
     ); 

    void ItemsSourceChanged() 
    { 
     _stack.Children.Clear(); 
     foreach (var item in ItemsSource) // ItemSource is a list of ViewModels 
     { 
      var view = ?; // How to resolve the View for this ViewModel? 
      var bindableObject = view as BindableObject; 
      if (bindableObject != null) 
       bindableObject.BindingContext = item; // Is this the Prism way to do this? 
      _stack.Children.Add(view); 
     } 
    } 
} 

Это ViewModel из ContentPage

public class MainPageViewModel: BindableBase 
{ 
    private List<BaseViewModel> _viewModels; 
    public List<BaseViewModel> ViewModels 
    { 
     get { return _viewModels; } 
     set 
     { 
      SetProperty(ref _viewModels, value); 
      OnPropertyChanged(); 
     } 

    } 

    public MainPageViewModel() 
    { 
     ViewModels = CreateViewModelsList(); 
    } 

    private List<BaseViewModel> CreateViewModelsList() 
    { 
     return new List<BaseViewModel>{ 
      new FirstViewModel(), 
      new SecondViewModel() 
     }; 
    } 
} 

Это, как я создаю карусель в моем MainPage и связывание списка ViewModels:

var carousel = new CarouselLayout(); 
[...] 
carousel.SetBinding(CarouselLayout.ItemsSourceProperty, "ViewModels"); 

Как привязать ViewModel к его представлению в методе CarouselLayout ItemsSourceChanged()?

ответ

0

Создайте также свойство связующего для вашего пользовательского элемента управления для доступа к свойству ItemTemplate.

public static readonly BindableProperty ItemTemplateProperty = 
    BindableProperty.Create(nameof(ItemTemplate), typeof(DataTemplate), typeof(CarouselLayout), default(DataTemplate)); 

public DataTemplate ItemTemplate 
{ 
    get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
    set { SetValue(ItemTemplateProperty, value); } 
} 

Тогда вы будете в состоянии сделать что-то вроде этого:

foreach (var item in this.ItemsSource) 
{ 
    var viewCell = this.ItemTemplate.CreateContent() as ViewCell; 
    viewCell.View.BindingContext = item; 
    _stack.Children.Add(viewCell.View); 
} 
Смежные вопросы