2009-09-01 52 views
3

我遇到按鈕的單擊事件時遇到問題,並且正在使用Silverlight 3.0 w /匹配Silverlight ToolkitSilverlight:定義分層數據模板中的事件處理程序

問題

我有這樣的TreeView:

TreeView sample http://a.imagehost.org/0939/TreeView.png

某個節點的值是其子節點值的總和。只有在葉子裏才能添加數據(暫時)。 我想要實現的是用戶可以添加(並最終刪除)樹中的條目,以最終創建自定義圖。 爲此,我希望「加號」插入一個新的行/節點作爲用戶點擊的節點的子節點。 (也就是說,如果我點擊「顯示器」上的加號,我會在下面指定CRT或TFT或其他類型的行)。

事情是,我所有的大腦都值得,我不知道如何接收任何有用的事件。 TextBlock,TextBox和Button在分層模板中定義,我無法在該模板中定義Click-handler。

OTOH,我還沒有找到一種方法從(c#)代碼中獲取某個TreeViewItem的模板項目。很好,我能做trv.ItemContainerGenerator.GetContainerFromItem(item),並且作爲Justin Angel showed我可以很好地改變字體大小,但是沒有找到任何方法來訪問文本框或按鈕。

有沒有什麼辦法可以捕捉按鈕的點擊事件?或者有什麼替代方法可以讓「添加下面」功能變得更好?

預先感謝您。


更多數據

樹形視圖XAML是這樣的:

<controls:TreeView x:Name="SankeyDataTree" 
    ItemTemplate="{StaticResource SankeyTreeTemplate}" BorderThickness="0" 
    Background="{x:Null}" HorizontalAlignment="Left" VerticalAlignment="Top"> 
    <controls:TreeViewItem IsExpanded="True"> 
     <controls:TreeViewItem.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock Text="Loading..."/> 
      </DataTemplate> 
     </controls:TreeViewItem.HeaderTemplate> 
    </controls:TreeViewItem> 
</controls:TreeView> 

我用這個HierarchicalDataTemplate(和偷Timmy Kokke的appraoch):

<Data:HierarchicalDataTemplate x:Key="SankeyTreeTemplate" ItemsSource="{Binding Children}"> 
    <Grid Height="24"> 
     <Grid.ColumnDefinitions> 
      <!-- ... --> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="{Binding Path=Value.name, Mode=TwoWay}" VerticalAlignment="Center"/> 
     <TextBox Text="{Binding Path=Value.flow, Mode=TwoWay}" Margin="4,0" VerticalAlignment="Center" d:LayoutOverrides="Width" Grid.Column="1" TextAlignment="Right" Visibility="{Binding Children, Converter={StaticResource BoxConverter}, ConverterParameter=\{box\}}"/> 
     <TextBlock Text="{Binding Path=Value.throughput, Mode=TwoWay}" Margin="4,0" VerticalAlignment="Center" d:LayoutOverrides="Width" Grid.Column="1" TextAlignment="Right" Visibility="{Binding Children, Converter={StaticResource BoxConverter}, ConverterParameter=\{block\}}"/> 
     <Button Margin="0" Grid.Column="2" Style="{StaticResource TreeViewItemButtonStyle}"> 
      <Image Source="../Assets/add.png" Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Button> 
    </Grid> 
</Data:HierarchicalDataTemplate> 

向該TreeView的是綁定一個「SimpleTree」,其價值基本上保持不變字符串(名稱)和兩個雙打(流量和吞吐量)。

public String name { get; set; } 
public Double flow { get; set; } 
public Double throughput { get; set; } 

(Plus作爲INotifyPropertyChanged的代碼即可獲得一個雙向綁定到文本框)。

回答

3

您可以將BehaviorHierarchicalDataTemplateButton,讓處理來自ButtonClick事件。

下載並安裝Expression Blend 3 SDK。一提到System.Windows.Interactivity加入該項目,並添加連接到Button一個Behavior:在HierarchicalDataTemplate

public class ButtonClickBehavior : Behavior<Button> { 

    protected override void OnAttached() { 
    base.OnAttached(); 
    AssociatedObject.Click += ButtonClick; 
    } 

    protected override void OnDetaching() { 
    base.OnDetaching(); 
    AssociatedObject.Click -= ButtonClick; 
    } 

    void ButtonClick(object sender, RoutedEventArgs e) { 
    Node node = AssociatedObject.DataContext as Node; 
    if (node != null) { 
     // Button clicked. Do something to associated node. 
    } 
    } 

} 

附上BehaviorButton(假設這個命名空間聲明:xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"):

<Button Margin="0" Grid.Column="2" Style="{StaticResource TreeViewItemButtonStyle}"> 
    <Image Source="../Assets/add.png" Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    <interactivity:Interaction.Behaviors> 
    <local:ButtonClickBehavior/> 
    </interactivity:Interaction.Behaviors> 
</Button> 

如果希望您可以將屬性添加到ButtonClickBehavior,並設置來自XAML的屬性以創建更可重用的Behavior

+0

太棒了。感謝您的幫助! 我知道微軟會徹底,有辦法做我想做的事情。 ;) – Cornelius 2009-09-02 08:23:02

+0

Node類在哪裏?我需要WPF UserControl中的確切行爲,但由於沒有對Node類的名稱空間的引用,所以無法將其編譯,因此我沒有提供幫助。謝謝。 – Shawn 2010-11-29 22:05:52

+0

'Node'類是你自己的類。它是樹視圖中每個節點使用數據綁定綁定到的對象的類。 – 2010-11-30 00:27:48

3

可以辦理後面的代碼按鈕單擊事件。要獲取數據,只需將其綁定到Tag屬性即可。

<Button Margin="0" Grid.Column="2" 
     Click="Button_Click" Tag="{Binding}" 
     Style="{StaticResource  TreeViewItemButtonStyle}">    
    <Image Source="../Assets/add.png" Margin="0" 
     HorizontalAlignment="Center" VerticalAlignment="Center"/>   
</Button> 

在後面的代碼中,處理它並訪問元素。

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var data = ((Button)sender).Tag as SimpleTreeNode 
} 

SimpleTreeNode是你的樹元素類的名稱。

您應該可以爲現在找到的數據添加一個新節點。

+0

謝謝您的回覆:) 它證實了我的懷疑;如果我的Page.xaml中有分層數據模板,它就可以工作。 如果模板駐留在資源字典中,是否有任何方法將事件綁定到按鈕(意思是,在一個完全不同的文件中)? (如果它通過在App.xaml中聚合,我是否必須將EventHandler放在App.xaml.cs中(或適當的代碼隱藏文件)?) – Cornelius 2009-09-01 13:42:57

相關問題