C# 如何为子属性在样式、Setter和HierarchycalDataTemplate上设置DataContext绑定?

C# 如何为子属性在样式、Setter和HierarchycalDataTemplate上设置DataContext绑定?,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,如果我使用 public partial class MainWindow : Window { readonly TreeViewViewModel TreeView; public MainWindow() { //... this.DataContext = TreeView; } } 那么下面的XAML就可以正常工作了 <TreeView x:Name="radTreeView" Grid.Row="1"

如果我使用

public partial class MainWindow : Window
{
    readonly TreeViewViewModel TreeView;
    public MainWindow()
    {
      //...
      this.DataContext = TreeView;
    }       
}
那么下面的XAML就可以正常工作了

<TreeView x:Name="radTreeView" Grid.Row="1"
                     Margin = "5,5,5,5"
                     ItemsSource = "{Binding FirstGeneration}"
                     Padding = "5"
                     ScrollViewer.HorizontalScrollBarVisibility = "Visible"
                     ScrollViewer.VerticalScrollBarVisibility = "Visible"
                     IsTextSearchEnabled="True" >
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem" >
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}" >
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}"  />
                <TextBlock VerticalAlignment="Center" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
我可以使用
DataContext=“{binding MainViewModel.TreeView}”
使部分绑定工作,但这仅适用于主TreeView元素,而不适用于没有DataContext属性的Style、Setter、hierarchycaldatatemplate

如何正确设置所有XAML TreeView元素的数据上下文

下面是我迄今为止尝试过的内容,但只有
ItemsSource=“{Binding FirstGeneration}”
使用正确的数据上下文

<TreeView x:Name="radTreeView" Grid.Row="1"
                     Margin = "5,5,5,5"
                     DataContext = "{Binding MainViewModel.TreeView}"
                     ItemsSource = "{Binding FirstGeneration}"
                     Padding = "5"
                     ScrollViewer.HorizontalScrollBarVisibility = "Visible"
                     ScrollViewer.VerticalScrollBarVisibility = "Visible"
                     IsTextSearchEnabled="True" >
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem" >
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}" >
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}"  />
                <TextBlock VerticalAlignment="Center" Text="{Binding Name}" />
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

假设
radTreeView
的容器的
DataContext
MainViewModel
的一个实例,您可以执行以下操作

<TreeView ... DataContext="{Binding TreeView}" ItemsSource="{Binding FirstGeneration}">

我认为问题在于我试图同时在Treeview元素和子元素上设置DataContext。这是否意味着DataContext是层次化的,并且有一条通过父控件的路径?是的,
DataContext
沿可视化树向下继承,直到它将在XAML中手动更改,或者例如
ItemsControl
将每个项目容器的
DataContext
设置为列表的项目我的代码实际工作正常(doh!)-为了编写这个问题的简单性,我从复选框和文本框中删除了DataContext,现在它在代码中可以正常工作。dkozl的回答帮助dugug解决了这个问题。
<TreeView ... DataContext="{Binding TreeView}" ItemsSource="{Binding FirstGeneration}">
<TreeView ... ItemsSource="{Binding TreeView.FirstGeneration}">