簡體   English   中英

如何從后台代碼設置ItemsSource進行數據綁定

[英]How to set ItemsSource for a databinding from the code-behind

我無法弄清楚如何以編程方式將ItemsSource設置為Pivot。 我正在使用注冊了ViewModel的MVVM Light ViewModelLocator。 然后,設置頁面的數據源,並在數據透視圖的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。

在View的xaml.cs中,我通常會這樣做:

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

但它不起作用..

綁定有很多方法,但讓我們討論一些...

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

     MyPivot.Itemsource=mycollection; 
  2. 您可以使用集合視圖源: http : //msdn.microsoft.com/zh-cn/library/system.windows.data.collectionviewsource( v=vs.110).aspx如果拖動容器,Visual Stuidio將創建這些視圖控制到表面上,它也將代碼放在代碼的后面,以便您可以“連接起來”。它可以很好地與任何集合類型配合使用,並與LINQ完全集成。
  3. 您可以在視圖模型中設置可觀察的集合,並從視圖綁定到它們。 最簡單的方法是在View XAML本身中創建View模型的靜態實例,因為Visual Studio屬性頁將“查看”視圖模型,並允許您將屬性選擇為項目源。 您所需要做的就是實現INPC或創建一個Dependency屬性(在需要時),一切准備就緒。 需要此屬性以在屬性更改時通知視圖。 https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=using%20inotifypropertychanged

如果您需要在運行時更改集合,則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}”

然后,您可以像這樣在viewmodel中隨意更改集合。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM