2013-07-12 64 views
3

所以,我对于未能成功地进行正确绑定一个TreeView的样式。 我已经绑定了用户控件的图形高度属性的高度属性,但是,由于某些未知原因,它找不到用户控件。我希望有人能够解释这个问题。禁止将模板的属性绑定到除模板父项以外的其他项目吗?为什么它不能仅仅因为它是一种风格而找到这个元素。WPF绑定风格到另一个控件的属性

从XAML文件的开头:

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

,然后风格:

<Style x:Key="SignalNameTreeViewStyle" TargetType="TreeView"> 
     <Setter Property="OverridesDefaultStyle" Value="True" /> 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TreeView"> 
      <ScrollViewer x:Name="SignalNameTreeView_ScrollViewer" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Hidden"> 
       <StackPanel> 
       <wpfExp:SignalNameBox x:Name="TreeViewTimeTextBox" Grid.Row="0" Grid.Column="0" 
         Height="{Binding ElementName=graph_viewer, Path=GraphHeight, Mode=OneWay}" 
         Width="200" 
         Margin="19,0,0,0" 
         MainText="Time" 
        /> 
       <ItemsPresenter/> 
       </StackPanel>   
      </ScrollViewer> 
      <ControlTemplate.Triggers> 
       <Trigger Property="ItemsControl.HasItems" Value="False"> 
       <Setter TargetName="TreeViewTimeTextBox" 
         Property="Visibility" 
         Value="Collapsed"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 

目前我得到的数据,从这种企图绑定错误绑定

ystem.Windows.Data Error: 39 : BindingExpression path error: 'GraphHeight' property not found on 'object' ''UserControl' (Name='graph_viewer')'. BindingExpression:Path=GraphHeight; DataItem='UserControl' (Name='graph_viewer'); target element is 'SignalNameBox' (Name='TreeViewTimeTextBox'); target property is 'Height' (type 'Double') 
System.Windows.Data Error: 39 : BindingExpression path error: 'GraphHeight' property not found on 'object' ''UserControl' (Name='graph_viewer')'. BindingExpression:Path=GraphHeight; DataItem='UserControl' (Name='graph_viewer'); target element is 'SignalGraphAxis' (Name='signal_axis'); target property is 'GraphHeight' (type 'Int32') 
System.Windows.Data Error: 39 : BindingExpression path error: '_SignalDataViewModel' property not found on 'object' ''UserControl' (Name='graph_viewer')'. BindingExpression:Path=_SignalDataViewModel.MaxTimeValue; DataItem='UserControl' (Name='graph_viewer'); target element is 'SignalGraphAxis' (Name='signal_axis'); target property is 'MaxTimeValue' (type 'Int32') 
+0

尝试更换''上TemplateBinding' Binding'。它有帮助吗? –

回答

2

我很确定你不能使用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}" /> 

编辑

看起来你可以使用FindAncestorreference an element outside a control template

{的RelativeSource FindAncestor}主要用于控制模板或可预见的自包含的UI组合物,其中控制始终是预计将在一个案件某种祖先类型的视觉树。

当然限制是,这只适用于控制的祖先,而不是兄弟姐妹。

+0

我想这是有道理的,为什么我不能从样式中引用外部元素,但是如果我将绑定放在特定树视图的控件模板中而不是样式中,它仍然不会绑定,并且似乎合理将一个特定的TreeView模板绑定到另一个控件 –

+0

@JamesJoshuaStreet我明白了你的观点,看起来我至少有一半是错的 - 你可以用'FindAncestor'绑定的'RelativeSource'(见上面的更新)。 – McGarnagle

+0

是的,尽管一切甚至相关来源与financestor没有正确约束。这只发生在设计时,虽然,所以我不知道发生了什么 –

相关问题