2017-02-08 1 views
0

프리즘을 사용하여 Xamarin.Form 앱을 개발하고 있습니다.ViewModel의 목록을 사용자 정의 컨트롤에 바인딩하는 방법은 무엇입니까?

var carousel = new CarouselLayout(); 
[...] 
carousel.SetBinding(CarouselLayout.ItemsSourceProperty, "ViewModels"); 
:이 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 목록을 바인딩을 만드는 방법이입니다

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을 CarouselLayout의 메서드로 바인딩하는 방법 ItemsSourceChanged()?

답변

0

컨트롤의 ItemTemplate 속성에 액세스 할 수있는 사용자 지정 컨트롤의 바인딩 가능한 속성을 만듭니다.

foreach (var item in this.ItemsSource) 
{ 
    var viewCell = this.ItemTemplate.CreateContent() as ViewCell; 
    viewCell.View.BindingContext = item; 
    _stack.Children.Add(viewCell.View); 
} 
:

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); } 
} 

그럼 당신은 이런 일을 할 수있을 것입니다

관련 문제