我遇到按钮的点击事件时遇到问题,并且正在使用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的代码,以便对文本框进行双向绑定。)
答案 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
。