WPF MVVM: configuración del contexto de datos de las vistas de pestaña
He experimentado un comportamiento vinculante extraño que se describeaquí. Solucioné muchos problemas y llegué a la conclusión de que el problema más probable radica en cómo configuro elDataContext
de cada una de las vistas de la pestaña.
tengo unTabControl
cuyoItemsSource
está vinculado a una lista deViewModels
.
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; }
public MainViewModel()
{
this.TabList = new ObservableCollection<TabViewModelBase>();
// Tab1ViewModel is derived from TabViewModelBase
this.TabList.Add(new Tab1ViewModel());
}
Entonces, ahora elMainViewModel
tiene una lista deTabViewModelBase
, que creo que es la forma correcta de MVVM de hacer esto. La vista (Tab1
) paraTabViewModelBase
se define usandoDataTemplate
.
Aquí es donde está el problema:
Tab1:
<UserControl.Resources>
<vm:Tab1ViewModel x:Key="VM" />
</UserControl.Resources>
<UserControl.DataContext>
<StaticResourceExtension ResourceKey="VM" />
</UserControl.DataContext>
Creo que la mayoría de la gente haría esto también, pero ... Hay algoterriblemente equivocado con este enfoque!
EnMainViewModel
, He instanciado manualmente unTab1ViewModel
. EnMainView
, SolíaDataTemplate
para decirle a la Vista que use unTab1
cada vez que ve unTab1ViewModel
. Eso significaMainView
instanciaría un objeto deTab1
clase.
Ahora,Tab1
necesita suDataContext
hacer vinculante con su propioTab1ViewModel
, entonces usamosStaticResource
para agregar unoTab1ViewModel
, excepto que esta es una nueva instancia!
Necesito configurar elDataContext
volviendo al original en el que hice una instanciaMainViewModel
. Entonces, ¿cómo configuro elDataContext
deTab1
dentroDataTemplate
?