WPF绑定样式到另一个控件';s属性

WPF绑定样式到另一个控件';s属性,wpf,xaml,binding,styles,Wpf,Xaml,Binding,Styles,因此,我有一个无法正确绑定的树视图样式。 我已将高度绑定到使用该样式的用户控件的graph height属性。但是,由于一些未知的原因,它找不到用户控件。我希望有人能解释一下这个问题。是否禁止将模板的属性绑定到模板化父对象以外的其他对象?为什么它找不到元素,仅仅因为它在一个样式中 从xaml文件的开头: <UserControl x:Class="WpfExperimental.GraphViewer" x:Name="graph_viewer" 我很确定不能使用Element

因此,我有一个无法正确绑定的树视图样式。 我已将高度绑定到使用该样式的用户控件的graph height属性。但是,由于一些未知的原因,它找不到用户控件。我希望有人能解释一下这个问题。是否禁止将模板的属性绑定到模板化父对象以外的其他对象?为什么它找不到元素,仅仅因为它在一个样式中

从xaml文件的开头:

<UserControl 
  x:Class="WpfExperimental.GraphViewer"
  x:Name="graph_viewer"

我很确定不能使用
ElementName
引用控件模板之外的元素。(虽然我现在找不到这样的文档。)即使可以,也没有什么意义——您正在尝试编写一个包含隐藏依赖项的样式,这将引入潜在的运行时错误

另一种方法是向控件添加依赖项属性。编写一个扩展
TreeView
的类,并给它一个名为
SignalNameBoxHeight
或类似名称的DP

public class ExtendedTreeView : TreeView
{
    public double SignalNameBoxHeight
    {
        get { return (double)GetValue(SignalNameBoxHeightProperty ); }
        set { SetValue(SignalNameBoxHeightProperty, value); }
    }

    public static readonly DependencyProperty SignalNameBoxHeightProperty =
        DependencyProperty.Register("SignalNameBoxHeight", 
        typeof(double), 
        typeof(ExtendedTreeView), 
        null);

    public ExtendedTreeView ()
    {
        this.DefaultStyleKey = typeof(Treeview);
    }
}
然后可以在控件模板内使用
TemplateBinding
设置属性:

<wpfExp:SignalNameBox
    `Height="{TemplateBinding SignalNameBoxHeight}"`
/>

剩下的就是让您的风格的消费者提供绑定源:

<my:ExtendedTreeView 
    SignalNameBoxHeight="{Binding ElementName=graph_viewer, Path=GraphHeight}" />


编辑

看起来您可以使用
FindAncestor
来:

{RelativeSource FindAncestor}主要用于控件模板或可预测的自包含UI组合中,用于控件始终应位于某个祖先类型的可视树中的情况


当然,它的局限性在于,这只适用于控件的祖先,而不适用于同级。

尝试在
TemplateBinding
上替换
Binding
。这有帮助吗?我想这是有道理的,为什么我不能从样式中引用外部元素,但是如果我将绑定放在特定treeview的控件模板中,而不是样式中,它仍然不会绑定,并且将特定treeview的模板绑定到另一个模板似乎是合理的control@JamesJoshuaStreet我明白你的意思,看起来我至少错了一半——你可以使用
RelativeSource
FindAncestor
绑定(见我上面的更新)。是的,尽管如此,即使是带有FindAncestor的RelativeSource也没有正确绑定。但这只发生在设计阶段,所以我不知道会发生什么,我很想忽略设计师,回到编写真正相关的东西;但我想,有一天,了解设计师的工作方式可能会很有用。设计师确实很有用,但它真的很脆弱。
<wpfExp:SignalNameBox
    `Height="{TemplateBinding SignalNameBoxHeight}"`
/>
<my:ExtendedTreeView 
    SignalNameBoxHeight="{Binding ElementName=graph_viewer, Path=GraphHeight}" />