无法从文本框获取绑定并从另一个视图模型绑定组合框

时间:2015-05-07 18:31:49

标签: wpf mvvm viewmodel

我对mvvm很新,所以请耐心等待。我有2个继承的View模型,即DBViewModel和PersonViewModel。我想在DBViewModel中添加person对象,并在PersonViewModel中将2个组合框与observablecollection绑定。

 public class PersonViewModel
{
    private ICommand AddCommand ;

    public Person PersonI{get;set;}
    public ObservableCollection<Person> EmployeeList{ get; set; }
    public ObservableCollection<String> OccupationList{ get; set; }

    public PersonViewModel()
    {
        PersonI = new Person();
        this.AddCommand = new DelegateCommand(this.Add);

        // get OccupationList and EmployeeList 
    }
    ......
}

 public class DBViewModel : PersonViewModel
{


    public PersonViewModel PersonVM { get; set; }

    public PersonViewModel()
    {
        PersonVM = new PersonViewModel();

    }
    ....
} 
<DataTemplate DataType='{x:Type viewModel:DBViewModel}'>
    <StackPanel>
          <TextBox Text="{Binding PersonI.Name}" />
    <ComboBox Name="cboccupation" ItemsSource="{Binding OccupationList}"
    DisplayMemberPath="Name"
    SelectedItem="{Binding SelectedItem}" SelectedValuePath="Id"/>

    <Button Content="Add" Command="{Binding AddCommand}" />

   <DataGrid ItemsSource="{Binding EmployeeList}" CanUserAddRows="True">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Occupation">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding OccupationList}" 
                                  DisplayMemberPath="Name" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

    </StackPanel>
    </DataTemplate> 

2 个答案:

答案 0 :(得分:0)

如果您想要一种更简单的方法,我认为您可以使用混合设置数据存储区域并将两个控件绑定到该字段。

答案 1 :(得分:0)

您的绑定正在尝试绑定PersonI上的属性OccupationListDBViewModel,但这些属性不存在。

您需要将它们指向PersonVM.PersonIPersonVM.OccupationList

<TextBox Text="{Binding PersonVM.PersonI.Name}" />
<ComboBox ItemsSource="{Binding PersonVM.OccupationList}" ... />

对于DataGrid中的ComboBox绑定,这可能不起作用,因为Grid中每行的DataContext是一个Person对象(由DataGrid.ItemsSource指定),而且我没有&#39;我认为Person有一个名为OccupationList的属性。

您需要更改绑定的源以使用具有OccupationList属性的对象。

例如,如果您的DataGrid名为MyDataGrid,则该ComboBox的以下绑定将起作用

<ComboBox ItemsSource="{Binding 
              ElementName=MyDataGrid, 
              Path=DataContext.PersonVM.OccupationList}" ... />

或者,您可以使用RelativeSource绑定使其查找父DataGrid对象,而无需指定名称

<ComboBox ItemsSource="{Binding 
              RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
              Path=DataContext.PersonVM.OccupationList}" ... />

作为旁注,你似乎对绑定和DataContext有点困惑。我喜欢关于初学者WPF主题的博客,并建议阅读What is this "DataContext" you speak of?。我发现它已经帮助这个网站上的许多WPF初学者理解了基本的绑定概念。 :)