Я испытал странное поведение привязки, которое описано here. Я сделал много проблем, и я пришел к выводу, что наиболее вероятная проблема заключается в том, как я установил DataContext
каждого из видов вкладок.WPF MVVM: настройка DataContext для вкладок Просмотров
У меня есть TabControl
, чья ItemsSource
привязана к списку ViewModels
.
MainView:
<TabControl ItemsSource="{Binding TabList}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:Tab1ViewModel}">
<v:Tab1 />
</DataTemplate>
</TabControl.Resources>
...
</TabControl>
MainViewModel:
public ObservableCollection<TabViewModelBase> TabList { get; set; }
pubic MainViewModel()
{
this.TabList = new ObservableCollection<TabViewModelBase>();
this.TabList.Add(new Tab1ViewModel()); // Tab1ViewModel is derived from TabViewModelBase
}
Итак, теперь MainViewModel
имеет список TabViewModelBase
, который я считаю, это правильный способ MVVM, чтобы сделать это. Вид (Tab1
) для TabViewModelBase
определяется с использованием DataTemplate
.
Здесь проблема:
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
Я думаю, что большинство людей будет делать это так, но ... Существует что-то ужасно неправильно с таким подходом!
В MainViewModel
, я создал экземпляр Tab1ViewModel
. В MainView
я использовал DataTemplate
, чтобы сообщить View, чтобы использовать Tab1
всякий раз, когда он видит Tab1ViewModel
. Это означает, что MainView
будет создавать объект класса Tab1
.
Теперь Tab1
нуждается в DataContext
сделать связываясь с его собственным Tab1ViewModel
, поэтому мы используем StaticResource
добавить одну Tab1ViewModel
, за исключением того, что это новый экземпляр марки!
Мне нужно установить DataContext
назад к оригиналу, который я создал в MainViewModel
. Итак, как мне установить DataContext
из Tab1
в пределах DataTemplate
?
просто удалите все ресурсы и код DataContext, который вы показываете для Tab1. ваш экземпляр Viewmodel находится в вашей коллекции, а DataTemplate определен в ваших вкладках. Свойства: – blindmeis
. Тогда у моего 'Tab1' не будет' DataContext', и я не смог бы привязать между Tab1 и Tab1ViewModel'. – Jai