如何为每个组合框设置datacontext?

时间:2013-06-14 09:25:32

标签: wpf mvvm

我在组合框(WPF,MVVM)中遇到问题。 我有一个组合框,它绑定到AViewModel(例如)。 要做到这一点,我确实有: - 一个模型 - AViewModel - Xaml文件:

<Window.DataContext>
    <ViewModel:AViewModel/>
</Window.DataContext>

工作正常。

但是,现在,我使用上面的组合框将另外一个组合框添加到相同的形式。这个组合框绑定到不同的ViewModel(例如BViewMoel,请注意,这个BViewModel位于上面的AViewModel的diffirent文件中)。 这是组合框xaml:

<ComboBox 
    DataContext="BViewModel" 
    ItemsSource="{Binding Path=MyList}" DisplayMemberPath="BName"/>

我的问题是:第二个组合框没有填充,因为它没有datacontext。 但是我无法为它设置datacontext,因为它是为AViewModel设置的。

我做了很多搜索,但我仍然坚持这一点。 我应该将所有ViewModel合并到一个ViewModel中并将其设置为Window的Datacontext还是任何理想的? 谢谢。

2 个答案:

答案 0 :(得分:4)

真的,我不会为每个组合框使用ViewModel。 Combobox是一个简单的控件,您应该将ItemsSource属性绑定到所有者视图的ViewModel的公共属性(例如,类型为ObservableCollection<T>)。

有时将ViewModel用于特定且复杂的用户控件非常有用。在这种情况下,您可以将viewModel公开为所有者视图的ViewModel的公共属性:

public class UCViewModel : ViewModelBase
{
}

public class MyViewViewModel : ViewModelBase
{
    public MyViewViewModel()
    {
        this.UCViewModel = new UCViewModel();
    }

    public UCViewModel UCViewModel { get; set; }
}

<Window x:Class="MyView">

    <MyComplexUsercontrol DataContext="{Binding UCViewModel}" />

</Window>

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

但是,对于一个简单的组合框,只需将其绑定到与所有者视图关联的ViewModel的属性。

答案 1 :(得分:2)

combobox1.DataContext = new AViewModel();
combobox2.DataContext = new BViewModel();

但我建议使用ViewModel包含两个属性。

public class ViewModel
{
    public AViewModel AViewModel{get;set;}
    public BViewModel BViewModel{get;set;}
}