2013-07-12 106 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沒有正確約束。這隻發生在設計時,雖然,所以我不知道發生了什麼 –

相關問題