如何为子属性设置Style、Setter和HierarchicalDataTemplate上的DataContext绑定



如果我使用设置窗口的DataContext

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是ViewModel的属性,这样TreeViewViewModel TreeViewMainViewModel mainViewModel的属性,并且在codeehind中的DataContext设置为

public partial class MainWindow : Window
{
    private MainViewModel mainViewModel;
    public MainWindow()
    {
      //...
      this.DataContext = this;
    }       
}

我可以使用DataContext = "{Binding MainViewModel.TreeView}"获得部分绑定,但这只适用于主TreeView元素,而不适用于没有DataContext属性的Style、Setter、HierarchicalDataTemplate。

如何正确设置所有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的容器的DataContextMainViewModel的实例,则可以执行

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

或不改变DataContext

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

最新更新