2017-02-08 2 views
0

私はXamarin.Formアプリケーションを開発するためにPrismを使用しています。私は、カスタムカルーセルコントロールを作成しています: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); 
     } 
    } 
} 

これはContentPage

のViewModelにある
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() 
     }; 
    } 
} 

をこれは私が私のメインページにカルーセルを作成してのviewmodelsリストを結合する方法である:

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

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

次に、あなたがこのような何かを行うことができるようになります

関連する問題