2015-12-30 16 views
1

如果我設置使用如何在Style,Setter和HierarchicalDataTemplate上爲子屬性設置DataContext綁定?

public partial class MainWindow : Window 
{ 
    readonly TreeViewViewModel TreeView; 
    public MainWindow() 
    { 
     //... 
     this.DataContext = TreeView; 
    }  
} 

那麼下面的XAML Window的DataContext的正常工作

<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是一個視圖模型的屬性,以便TreeViewViewModel TreeView是一個屬性的MainViewModel mainViewModel和DataContext的代碼隱藏中設置爲

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

我可以綁定W的部分使用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> 
+0

我的代碼實際上工作正常(doh!) - 爲了簡化寫這個問題,我從CheckBox和TextBox中移除了DataContext,現在在代碼中工作正常。 dkozl的回答幫助解決了這個問題。 – pathDongle

回答

2

假設爲radTreeView容器DataContextMainViewModel一個實例,你可以做

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

或不改變DataContext

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

我認爲問題在於我試圖在Treeview元素和子元素上同時設置DataContext。這是否意味着DataContext是分層的,並且有一個通過父控件的路徑? – pathDongle

+1

是的,'DataContext'在可視化樹下繼承,直到它將在XAML中手動更改或例如'ItemsControl'將每個項容器的'DataContext'設置爲列表項 – dkozl

相關問題