【问题标题】:How to set DataContext Binding on Style, Setter and HierarchicalDataTemplate for sub properties?如何在子属性的 Style、Setter 和 HierarchicalDataTemplate 上设置 DataContext 绑定?
【发布时间】:2016-04-04 10:01:33
【问题描述】:

如果我使用 Window 设置 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 TreeView 是 MainViewModel mainViewModel 的属性,并且代码隐藏中的 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>

【问题讨论】:

  • 我的代码确实可以正常工作(doh!)-为简单起见,我从 CheckBox 和 TextBox 中删除了 DataContext,现在在代码中可以正常工作。 dkozl 的回答帮助解决了这个问题。

标签: c# wpf mvvm binding


【解决方案1】:

假设radTreeView的容器的DataContext是MainViewModel的一个实例,你可以这样做

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

或不更改DataContext

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

【讨论】:

  • 我认为问题在于我试图同时在 Treeview 元素和子元素上设置 DataContext。这是否意味着 DataContext 是分层的并且有通过父控件返回的路径?
  • 是的,DataContext 会沿可视化树继承,直到在 XAML 中手动更改它,或者例如 ItemsControl 会将每个项目容器的 DataContext 设置为列表中的项目跨度>
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2010-09-27
  • 2013-04-16
  • 2015-09-17
  • 1970-01-01
  • 2012-08-21
  • 2021-10-24
  • 1970-01-01
相关资源
最近更新 更多