在 DataTemplate 中绑定用户控件 Datacontext
Binding usercontrols Datacontext in DataTemplate
我在 TabItem 中有两个用户控件。 TabItem 有它自己的 ViewModel,它有一个 属性 TabItem 的子 ContentControl 的内容绑定到。这个 属性 代表另一个视图模型,它将根据它是哪个视图来改变视图。这是一个例子:
<TabItem DataContext="{Binding Path=MainLayerTabViewModel, Source={StaticResource ViewModelLocator}}" Header="Layers">
<ContentControl Content="{Binding ChildViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:LayersViewModel}">
<views:LayersTabView DataContext="{Binding ChildViewModel}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
<views:AlternateLayersTabView DataContext="{Binding ChildViewModel}" />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
这是用作 tabitem 的数据上下文的视图模型:
public class MainLayerTabViewModel : ViewModelBase
{
public object ChildViewModel { get; set; }
public MainLayerTabViewModel()
{
ChildViewModel = (App.Current.Resources["ViewModelLocator"] as ViewModelLocator).LayersViewModel;
}
}
现在,ChildViewModel
的两种可能的 ViewModel 是 LayersViewModel
和 UserDrawnLayersViewModel
。当我将 ChildViewModel
更改为其中之一时,视图会通过 DataTemplate
正确切换。但是 DataContext
实际上并没有被设置。没有任何东西被束缚。我尝试为 MainLayerTabViewModel 中的每个 ViewModel 创建单独的属性,并将每个视图的 DataContext
绑定到它自己的 属性,但这也不起作用。
我还没有验证这一点,但是我可以看到你的代码有几个问题。
视图应该是
<ContentControl Content="{Binding ChildViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:LayersViewModel}">
<views:LayersTabView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
<views:AlternateLayersTabView/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
视图模型:
public class MainLayerTabViewModel : ViewModelBase
{
public ViewModelBase ChildViewModel { get; set; }
public MainLayerTabViewModel()
{
ChildViewModel = new LayersViewModel();
//or ChildViewModel = new UserDrawnLayersViewModel();
}
}
希望对您有所帮助..
我在 TabItem 中有两个用户控件。 TabItem 有它自己的 ViewModel,它有一个 属性 TabItem 的子 ContentControl 的内容绑定到。这个 属性 代表另一个视图模型,它将根据它是哪个视图来改变视图。这是一个例子:
<TabItem DataContext="{Binding Path=MainLayerTabViewModel, Source={StaticResource ViewModelLocator}}" Header="Layers">
<ContentControl Content="{Binding ChildViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:LayersViewModel}">
<views:LayersTabView DataContext="{Binding ChildViewModel}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
<views:AlternateLayersTabView DataContext="{Binding ChildViewModel}" />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
这是用作 tabitem 的数据上下文的视图模型:
public class MainLayerTabViewModel : ViewModelBase
{
public object ChildViewModel { get; set; }
public MainLayerTabViewModel()
{
ChildViewModel = (App.Current.Resources["ViewModelLocator"] as ViewModelLocator).LayersViewModel;
}
}
现在,ChildViewModel
的两种可能的 ViewModel 是 LayersViewModel
和 UserDrawnLayersViewModel
。当我将 ChildViewModel
更改为其中之一时,视图会通过 DataTemplate
正确切换。但是 DataContext
实际上并没有被设置。没有任何东西被束缚。我尝试为 MainLayerTabViewModel 中的每个 ViewModel 创建单独的属性,并将每个视图的 DataContext
绑定到它自己的 属性,但这也不起作用。
我还没有验证这一点,但是我可以看到你的代码有几个问题。
视图应该是
<ContentControl Content="{Binding ChildViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:LayersViewModel}">
<views:LayersTabView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDrawnLayersViewModel}">
<views:AlternateLayersTabView/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
视图模型:
public class MainLayerTabViewModel : ViewModelBase
{
public ViewModelBase ChildViewModel { get; set; }
public MainLayerTabViewModel()
{
ChildViewModel = new LayersViewModel();
//or ChildViewModel = new UserDrawnLayersViewModel();
}
}
希望对您有所帮助..