2009-09-01 3 views
3

버튼의 클릭 이벤트에 문제가 있고 Silverlight Toolkit과 일치하는 Silverlight 3.0을 사용하고 있습니다.Silverlight : 계층 적 데이터 템플릿에 이벤트 처리기를 정의하십시오.

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으로 글자 크기를 아주 잘 바꿀 수 있지만 텍스트 상자 나 버튼에 접근 할 방법을 찾지 못했습니다.

버튼에 클릭 이벤트를 캡처하는 방법이 있습니까? 또는 "아래에 추가"기능을 제공하는 다른 방법이 있습니까?

미리 감사드립니다.

<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> 


데이터

더 트 리뷰의 XAML이있다 바운드는 "SimpleTree"이며, 그 값은 기본적으로 문자열 (이름)과 두 개의 double (흐름 및 처리량).

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

는 (플러스에서 INotifyPropertyChanged의 코드는 텍스트 상자에 양방향 바인딩을 얻을 수 있습니다.)

답변

3

당신은 HierarchicalDataTemplate에서 ButtonBehavior를 부착하고이 Button에서 Click 이벤트를 처리하도록 할 수 있습니다.

Expression Blend 3 SDK을 다운로드하여 설치하십시오. 프로젝트에 System.Windows.Interactivity에 대한 참조를 추가하고 Button에 부착 된 Behavior 추가

<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> 

경우 : (: xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"이 네임 스페이스 선언을 가정) HierarchicalDataTemplateButtonBehavior

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. 
    } 
    } 

} 

를 부착 원하는 경우 ButtonClickBehavior에 속성을 추가하고 XAML에서 속성을 설정하여 더 재사용 가능한 Behavior을 만들 수 있습니다.

+0

굉장합니다. 도와 줘서 고마워! 나는 마이크로 소프트가 철저히하고 내가 시도한 것을 할 수있는 방법이 있다는 것을 알았다. ;) – Cornelius

+0

Node 클래스는 어디에 있습니까? WPF UserControl에서이 정확한 동작이 필요하지만 Node 클래스의 네임 스페이스에 대한 참조가 없기 때문에 컴파일 할 수 없습니다. Google에서 도움이되지 않았습니다. 감사. – Shawn

+0

'Node' 클래스는 당신 자신의 클래스입니다. 트리 뷰의 각 노드는 데이터 바인딩을 사용하여 바인딩되는 객체의 클래스입니다. –

3

당신은 뒤에 코드에서 버튼 클릭 이벤트를 처리 할 수 ​​있습니다. 데이터를 얻으려면 태그 속성에 바인딩하십시오.

<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> 

코드를 처리하고 요소에 액세스하십시오. SimpleTreeNode이 나무 요소 클래스의 이름입니다

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

.

지금 발견 된 데이터에 새 노드를 추가 할 수 있어야합니다.

+0

답장을 보내 주셔서 감사합니다. :) 내가 의심 한 것을 확인했습니다. 내 Page.xaml에 계층 적 데이터 템플릿이 있으면 작동합니다. 템플릿이 리소스 사전에있는 경우 이벤트를 단추에 바인딩 할 수 있습니까 (즉, 상당히 다른 파일에 있음)? (를 통해 App.xaml에 집계 된 경우 App.xaml.cs (또는 코드 숨김 파일을 알맞게 지정)에 EventHandler를 배치해야합니까?) – Cornelius

관련 문제