我在组合框(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还是任何理想的? 谢谢。
答案 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;}
}