如何从代码隐藏中为数据绑定设置ItemsSource

时间:2014-11-11 15:33:32

标签: c# xaml mvvm binding mvvm-light

我无法弄清楚如何以编程方式将ItemsSource设置为我的Pivot。我正在使用MVVM Light ViewModelLocator注册我的ViewModel。然后我设置了我的Page的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>

所以在除TripTypeViewModelDataSource之外的ViewModel中我还有TripTypeViewModelDataSource2。

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

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

但它不起作用..

1 个答案:

答案 0 :(得分:1)

有许多方法可以约束,但让我们讨论几个...

  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将创建这些,它还会将代码放在代码后面,以便您可以&#34; wire-it-向上&#34;它适用于任何集合类型,并与LINQ完全集成。
  3. 您可以在视图模型中设置可观察集合,并从视图中绑定它们。最简单的方法是在View XAML中创建一个View Model的静态实例,因为visual studio属性页面会&#34;参见&#34;视图模型,允许您选择属性作为项目源。您需要做的就是实现INPC或创建一个依赖属性(如果需要),你就可以了。您需要此属性以在属性更改时通知视图。 https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=using%20inotifypropertychanged
  4. 如果您需要在运行时更改集合,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 =&#34; {Binding MyCVS}&#34;

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

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