2015-05-07 3 views
0

Я смело новичок в mvvm, так что медведь со мной. У меня есть 2 модели просмотра, которые унаследованы именно DBViewModel и PersonViewModel. Я хотел бы добавить объект person в DBViewModel и связать 2 combobox с наблюдаемым цветом в PersonViewModel.Невозможно получить привязку из текстового поля и связать combobox с другой моделью просмотра

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> 
+1

PersonI находится в PersonViewModel, и поэтому вам нужно сделать это следующим образом: . То же самое нужно сделать для ComboBox –

ответ

0

если вы хотите более простой подход я думаю, вы могли бы установить поле датастора с использованием смеси и связать оба управления в этой области.

0

Ваши привязки пытаются привязать к свойствам PersonI и OccupationList на DBViewModel, однако этих свойств не существует.

Вы должны указать их вместо PersonVM.PersonI и PersonVM.OccupationList.

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

Для связывания внутри DataGrid, что, вероятно, не будет работать, потому что DataContext каждой строки в сетке является Person объекта (определяется DataGrid.ItemsSource) вашего ComboBox, и я не думаю, что 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 на этом сайте понять базовую концепцию привязки. :)

+0

Спасибо. Мне удалось получить значение из текстового поля. Но все еще имеет обязательную проблему с combobox в datagrid. – user3679184

+0

Вы привязываете DataGrid к списку объектов 'Person', поэтому' DataContext' за каждой строкой является 'Person', а' Person' не имеет свойства, называемого 'OccupationList'. Вам нужно изменить источник для привязки, чтобы указать на нужный объект. Если вы дадите свое имя «DataGrid», вы можете использовать «ElementName» в своей привязке, чтобы указать источник данных для привязки, например ' '. Кроме того, вы можете использовать привязку RelativeSource для поиска родительского DataGrid. Я уточню свой ответ. – Rachel

Смежные вопросы