Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从代码隐藏中为数据绑定设置ItemsSource_C#_Xaml_Mvvm_Binding_Mvvm Light - Fatal编程技术网

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

C# 如何从代码隐藏中为数据绑定设置ItemsSource,c#,xaml,mvvm,binding,mvvm-light,C#,Xaml,Mvvm,Binding,Mvvm Light,我不知道如何通过编程将ItemsSource设置为我的Pivot。我正在使用MVVM Light ViewModelLocator注册我的ViewModel。然后设置页面的数据源,并在Pivot的xaml中设置其ItemsSource。但在ViewModel中,我还有其他集合,我希望在运行时将其更改为Pivot的ItemsSource: 这是我的ViewModelLocator: public class ViewModelLocator { public ViewModelLocato

我不知道如何通过编程将ItemsSource设置为我的Pivot。我正在使用MVVM Light ViewModelLocator注册我的ViewModel。然后设置页面的数据源,并在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() {}
}

但是它不起作用。

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

  • 直接指向枢轴对象本身:

  • 您可以使用集合视图源代码:如果您将容器控件拖到表面上,Visual Studio将创建这些控件,它还将代码放在后面的代码中,这样您就可以“连接起来”,它可以很好地与任何集合类型配合使用,并与LINQ完全集成
  • 您可以在视图模型中设置observable集合,并从视图绑定到它们。最简单的方法是在视图XAML本身中创建视图模型的静态实例,因为VisualStudio属性页将“看到”视图模型,并允许您选择该属性作为项源。您所需要做的就是实现INPC或创建一个依赖属性(在需要的地方),然后就可以开始了。当属性发生更改时,您需要此选项来通知视图 如果需要在运行时更改集合,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;
    

    但我仍然不知道如何访问ViewModel中的这些集合来执行“MyPivot.Itemsource=mycollection;”。它们不是静态属性。viewmodel只包含集合,该集合应该是具有getter setters的公共属性。绑定可以在xaml中完成,也可以作为一个单独的关注点在VM中完成。不要在MyPivot.Itemsource属性之后进行绑定,而要在VM.TripTypeViewModelDataSource属性之后进行绑定。获取VM的实例并设置集合。我得到了它。我必须更改我的Pivots itemsource绑定到的ViewModel中集合的内容。但是,当我想用另一种类型的元素(它的ObservableCollection)填充它时,如何更改它呢?要绑定到其他类型,每种类型需要2个ObservableCollection(除非您谈论的是超类型和子类型=继承)。但是,当您需要切换视图绑定的类型时,VM只需执行以下操作:MyPivot.Itemsources=Collection1;或Collection2,具体取决于需要。认识到直接在虚拟机内设置UI/view属性肯定不是MVVM,这将引导您采用不同的方法。正如其中一个答案所说,您要做的是将
    ItemsSource
    定义为绑定到VM集合属性。然后,您可以在您的虚拟机中自由更改该虚拟机属性,而无需使用特定的UI元素。
    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}"
    
    MyCVS.Source = Collection1;
    MyCVS.Source = Collection2;