0

前文:

次の XAML があります。

<controls:TreeView x:Name="tv">
    <controls:TreeViewItem x:Name="tvi" Header="RootNodeTitle" IsExpanded="True">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <controls:TreeViewItem Header="{Binding TextToBindTo}" Selected="TreeViewItem_Selected" />
            </DataTemplate>
         </ItemsControl.ItemTemplate>
     </controls:TreeViewItem>
</controls:TreeView>

そして、次の .NET コード ビハインド:

_viewCollection = New CollectionViewSource()
_viewCollection.Source = _data.RoleList
tvi.ItemsSource = _viewCollection.View

問題:

の子 (データバインディングに基づいて動的に生成される) のSelectedイベントにイベントハンドラーをアタッチしたいと考えています。tvi

Selected="..."で(XAML に示されているように) マークアップを使用しようとしましたItemTemplateが、これは機能しません。

質問:

これはどのように行うことができますか?

4

1 に答える 1

1

そのネストされた TreeViewItem で Selected イベントが処理されない理由はわかりませんが、TreeView で ItemsSource を設定するように少し変更すると、処理されます。

<controls:TreeView x:Name="tv"  SelectedItemChanged="tv_SelectedItemChanged">
        <controls:TreeView.ItemTemplate>
            <DataTemplate>
                <!-- this Selected event handler does get called -->
                <controls:TreeViewItem Header="{Binding Name}" Selected="TreeViewItem_Selected" >
...

ただし、発生するイベントにはアイテムに関する有用な情報が含まれていないため、そのイベントから有用なものを賢明に導き出すことはできません。

Setting a handler for the SelectedItemChanged event on the TreeView works and also contains the usual OldValue and NewValue properties in the EventArgs.

このイベントは、ネストされているかどうかにかかわらず、すべての TreeViewItem に対しても発生します。

これを試して:

<controls:TreeView x:Name="tv"  SelectedItemChanged="tv_SelectedItemChanged">
    <controls:TreeViewItem x:Name="tvi" Header="RootNodeTitle" IsExpanded="True" Selected="TreeViewItem_Selected" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <controls:TreeViewItem Header="{Binding}" Selected="TreeViewItem_Selected" >
                    <Border Background="Black" Height="25" Width="25" />
                </controls:TreeViewItem>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </controls:TreeViewItem>
</controls:TreeView>

...

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    tvi.ItemsSource = GetItems();

}

private IEnumerable GetItems()
{
    for (int i = 0; i < 10; i++)
    {
        yield return i;
    }
}

private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var oldItem = e.OldValue;
    var newItem = e.NewValue;
}
于 2012-08-04T09:27:21.817 に答える