如何从代码后面为数据绑定设置ItemsSource

本文关键字:数据绑定 设置 ItemsSource 代码 | 更新日期: 2023-09-27 18:29:59

我不知道如何用程序将ItemsSource设置为我的Pivot。我正在使用MVVM Light ViewModelLocator注册我的ViewModel。然后我设置页面的DataSource,并在Pivot的xaml中设置其ItemsSource。但在ViewModel中,我有其他集合,我想在运行时将其更改为Pivot:的ItemsSource

这是我的ViewModelLocator:

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<TripTypeViewModel>();
    }
    public TripTypeViewModel TripTypeVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<TripTypeViewModel>();
        }
    }
    public static void Cleanup() {}
}

页面的XAML:

<Page
...
DataContext = "{Binding Source={StaticResource Locator}, Path=TripTypeVM }">
...
<Pivot x:Name="TripsSegmentsPivot" Title="Locator" Foreground="#FF888888" Style="{StaticResource PivotStyle1}" SelectionChanged="Pivot_SelectionChanged" Margin="0" Grid.Row="1" ItemTemplate="{StaticResource TripTypeTemplate1}" ItemsSource="{Binding TripTypeViewModelDataSource}">
        <Pivot.HeaderTemplate>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="{Binding id}"/>
                </Grid>
            </DataTemplate>
        </Pivot.HeaderTemplate>
    </Pivot>

因此,在ViewModel中,除了TripTypeViewModelDataSource之外,我还有TripTypeViewModelDataSource2。

在视图的xaml.cs中,我通常会这样做:

TripsSegmentsPivot.ItemsSource = ViewModelLocator.TripTypeVM.TripTypeViewModelDataSource;
TripsSegmentsPivot.ItemsSource = ViewModelLocator.TripTypeVM.TripTypeViewModelDataSource2;

但它不起作用。。

如何从代码后面为数据绑定设置ItemsSource

有很多方法可以绑定,但让我们讨论一些。。。

  1. 直接指向Pivot对象本身:http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource(v=vs.105).aspx

    MyPivot.Itemsource=mycollection;
    
  2. 您可以使用集合视图源:http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource(v=vs.110).aspx如果你把一个容器控件拖到表面上,Visual Stuidio会创建这些控件,它还会把代码放在后面的代码中,这样你就可以"连接起来"。它可以很好地与任何集合类型配合使用,并与LINQ完全集成
  3. 您可以在视图模型中设置可观察集合,并从视图绑定到它们。最简单的方法是在视图XAML本身中创建视图模型的静态实例,因为visual studio属性页将"查看"视图模型,并允许您选择该属性作为项源。你所需要做的就是实现INPC或创建一个依赖属性(在需要的地方),然后你就可以开始了。当特性发生更改时,您需要这样来通知视图。https://www.google.com/webhp?sourceid=chrome-即时&离子=1&espv=2&ie=UTF-8#q=使用%20inotifyproperty更改

如果您需要在运行时更改集合,CollectionViewSource的使用非常简单。。像这样。。。

MyCollectionViewSource.Source = MyCollection.Where(p=>p.Name==SelectedName).ToList(); 
MyCollectionViewSource.Source = MyCollection.Where(p=>p.ID > 500).ToList();
MyCollectionViewSource.Source = MyOtherCollection.ToList();
MyCollectionViewSource.Source = JustSayNoToObamaCare();

在当前代码中,它显示:

ItemsSource="{Binding TripTypeViewModelDataSource}"

如果像这样使用CollectionViewSource:ItemsSource="{Binding MyCVS}"

然后,您可以在视图模型中随意更改集合,如下所示。

MyCVS.Source = Collection1;
MyCVS.Source = Collection2;