在XAML中将多个ViewModel绑定在View中

时间:2014-10-23 12:47:21

标签: c# wpf xaml mvvm windows-phone

我有一个ViewModel类" MyViewModel"在里面我有一个ObservableCollection" MyCollection"。

然后在代码隐藏视图中,我这样做来设置数据上下文:

this.DataContext = new MyViewModel();

并在视图的前端

<Pivot ItemsSource="{Binding MyCollection}" SelectionChanged="Pivot_SelectionChanged" Margin="0" Grid.Row="1">

但是如果我需要使用不同的ViewModel&#34; MyViewModel2&#34;用&#34; MyCollection2&#34;在这个视图里面。我该如何跳过这一步:

this.DataContext = new MyViewModel();

并仅在xaml中绑定?

我尝试了这个但没有任何结果:

<Pivot ItemsSource="{Binding MyViewModel.MyCollection}" SelectionChanged="Pivot_SelectionChanged" Margin="0" Grid.Row="1">

2 个答案:

答案 0 :(得分:4)

您最好在同一个视图模型中使用两个集合... 或者您可以使用主ViewModel类来引用两个子视图模型;像这样的东西:

MyViewModel类:

public class MyViewModel
{
    public ObservableCollection<string> DataInfo { get; set; }

    public MyViewModel()
    {
        DataInfo = new ObservableCollection<string>();            
    }
}

MasterViewModel类:

public class MasterViewModel
{
    public MyViewModel VM1 { get; set; }
    public MyViewModel VM2 { get; set; }

    public MasterViewModel()
    {
        this.VM1 = new MyViewModel();
        this.VM2 = new MyViewModel();

        VM1.DataInfo.Add("Data 1-1");
        VM1.DataInfo.Add("Data 1-2");

        VM2.DataInfo.Add("Data 2-1");
        VM2.DataInfo.Add("Data 2-2");
    }
}

查看代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MasterViewModel();
    }
}

<强> XAML

<Window x:Class="DeleteMe4SOw.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="400" Width="525">
    <StackPanel Orientation="Vertical">
        <ListView ItemsSource="{Binding VM1.DataInfo}" Height="150" Margin="10" />
        <ListView ItemsSource="{Binding VM2.DataInfo}" Height="150" Margin="10"/>
    </StackPanel>
</Window>

答案 1 :(得分:1)

这是我的大师班:

class CompositeViewModel
{
    public TripsResponseTypeViewModel tripsResponseTypeViewModel { get; set; }
    public TripsViewModel tripsViewModel { get; set; }
}
在TripsResponseTypeViewModel中的

我有:

...
    private ObservableCollection<TripsResponseType> _tripsViewModelDataSource;
    public ObservableCollection<TripsResponseType> TripsViewModelDataSource
    {
        get
        {
            if (null == this._tripsViewModelDataSource)
            {
                this._tripsViewModelDataSource = new ObservableCollection<TripsResponseType>();
            }

            return this._tripsViewModelDataSource;
        }
    }
...

在我的视图中,我想将此TripsViewModelDataSource设置为Pivot的ItemsSource,如下所示:

<Pivot ItemsSource="{Binding tripsResponseTypeViewModel.TripsViewModelDataSource}"...

在View.xaml.cs中,我按照你的说法做了:

this.DataContext = new CompositeViewModel();

什么都没有..