Binding HierarchycalDataTemplate中的绑定FocusedElement
我试图在HierarchycalDataTemplate中聚焦控件。不幸的是,我尝试绑定到模板中的控件失败。这是我的密码:Binding HierarchycalDataTemplate中的绑定FocusedElement,binding,focusmanager,Binding,Focusmanager,我试图在HierarchycalDataTemplate中聚焦控件。不幸的是,我尝试绑定到模板中的控件失败。这是我的密码: <HierarchicalDataTemplate DataType="{x:Type TreeView_Experiment:BookmarkPage}"> <DockPanel> <ToggleButton ... edited for brevity ... />
<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>
当treeview项获得焦点,但{Binding ElementName=EditBox}失败并显示消息“找不到引用为'ElementName=EditBox,…'绑定的源”时,触发
如何修复此绑定?还是有更好的方法在HierarchycalDataTemplate中设置控件的焦点
提前感谢您的帮助。我可以通过在后面添加这段难看的代码来实现这一点。将此附加到树视图的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();
}
private void SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
var treeView=发送方作为treeView;
变量选择容器=
typeof(TreeView).GetProperty(“SelectedContainer”,BindingFlags.NonPublic | BindingFlags.Instance)。
GetValue(treeView,null)作为treeView项;
//找到我们想要关注的元素。
var focusControl=selectedContainer.FindVisualChild();
如果(焦点控制!=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;
}
public static T FindVisualChild(此DependencyObject对象),其中T:DependencyObject
{
var childCount=visualtreeheloper.GetChildrenCount(obj);
for(int i=0;i
与其查看树状视图并试图找到要聚焦的项目,不如让树状视图本身进行聚焦