2011-03-15 50 views
1

我想将一个控件集中在HierarchicalDataTemplate中。不幸的是,我尝试绑定到模板内的控件失败。这里是我的代码:在HierarchicalDataTemplate中绑定FocusedElement

 <HierarchicalDataTemplate DataType="{x:Type TreeView_Experiment:BookmarkPage}"> 
      <DockPanel> 
       <ToggleButton ... edited for brevity ... /> 
       <Controls:EditableTextBlock x:Name="EditBox" Text="{Binding Path=Title}" VerticalAlignment="Center" IsEditable="True" Focusable="True"/> 
      </DockPanel> 
      <HierarchicalDataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Value="true"> 
        <!-- The Value binding fails with the error: Cannot find source for binding with reference 'ElementName=EditBox --> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=EditBox}"/> 
       </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
     </HierarchicalDataTemplate> 

当树视图项获得焦点的触发火灾,但{绑定的ElementName =编辑框}失败的消息“无法找到源参考结合“的ElementName =编辑框,.. 。“

我该如何解决这个绑定问题?或者是否有更好的方法来设置HierarchicalDataTemplate中的控件焦点?

在此先感谢您的帮助。

回答

0

我能够通过添加这个丑陋的一点点代码来得到这个工作。连接这TreeView的onselection改变:需要

private void SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     var treeView = sender as TreeView; 

     var selectedContainer = 
      typeof (TreeView).GetProperty("SelectedContainer", BindingFlags.NonPublic | BindingFlags.Instance). 
       GetValue(treeView, null) as TreeViewItem; 

     // Find the element we want to focus. 
     var focusControl = selectedContainer.FindVisualChild<TextBox>(); 
     if (focusControl != null) 
      focusControl.Focus(); 
    } 

下面的扩展方法:

public static T FindVisualChild<T>(this DependencyObject obj) where T : DependencyObject 
    { 
     var childCount = VisualTreeHelper.GetChildrenCount(obj); 
     for (int i = 0; i < childCount; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is T) 
      { 
       return (T)child; 
      } 

      T childOfChild = FindVisualChild<T>(child); 
      if (childOfChild != null) 
      { 
       return childOfChild; 
      } 
     } 
     return null; 
    } 
0

而不是看TreeView和试图找到该项目集中,它可能是更好的有TreeViewItem本身做了重点。

相关问题