Silverlight:在分层数据模板中定义事件处理程序

时间:2009-09-01 10:38:27

标签: silverlight treeview events

我遇到按钮的点击事件时遇到问题,并且正在使用Silverlight 3.0 w /匹配Silverlight Toolkit

问题

我有这个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我可以很好地改变字体大小,但没有找到任何方法来访问文本框或按钮。

有没有办法将click事件捕获到按钮?或者获得“添加以下”功能的任何替代方法?

提前谢谢。


更多数据

treeview 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; }

(加上INotifyPropertyChanged的代码,以便对文本框进行双向绑定。)

2 个答案:

答案 0 :(得分: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 是树元素类的名称。

您应该能够为现在找到的数据添加新节点。

答案 1 :(得分:3)

您可以将Behavior附加到Button中的HierarchicalDataTemplate,然后让Click处理Button个事件。

下载并安装Expression Blend 3 SDK。在项目中添加对System.Windows.Interactivity的引用,并添加附加到Behavior的{​​{1}}:

Button

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. } } } 附加到Behavior中的Button(假设此命名空间声明:HierarchicalDataTemplate):

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> 添加属性,并从XAML设置属性以创建更可重用的ButtonClickBehavior