1

2つの使用コントロールを備えたウィンドウがあります。1つはTreeViewコントロールをカプセル化し、もう1つは選択したTreeViewItemsの詳細の文字列表現です。

TreeViewコントロールはすでに自給自足です-それはそれ自体にコンテンツアイテムを投入します。各TreeViewItemにはデータコンテキストがあります。

これが私が起こる必要があることです:

  1. ユーザーがアイテムをクリックするたびに、ウィンドウのルートコンテナでキャッチされているSelectedroutedイベントが生成されます。
  2. 選択されたTreeViewItemのデータコンテキストからデータ(プロパティ値)を取得できるように、Selectedroutedイベントを処理するイベントハンドラーが必要です。
  3. この値に基づいて、イベントハンドラーはDetailsViewコントロールを作成し、データを入力します。

選択したイベントの処理に関して、私のアプローチは正しいですか?選択したアイテムのデータコンテキストからプロパティ値を取得するにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

0

プロパティをTreeViewのSelectedItemにバインドすると、問題を修正できます。以下のコードは、私が検討していることを表しています。使用している2つのUCについて、SelectedItemの1つのプロパティを公開できます。

XAML:

<TreeView x:Name="Tree1">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
<TextBlock Text="{Binding ElementName=Tree1,Path=SelectedItem.Name}" />

アイテムのエンティティ

public class Item
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string name;
    private Collection<Item> items;

    public Collection<Item> Items { get { return items; } }

    public Item()
    {
        items = new Collection<Item>();
    }

    public string Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("Name"); }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

バインディングソース

Item item = new Item { Name = "A" };
item.Items.Add(new Item { Name = "A_1" });
item.Items.Add(new Item { Name = "A_2" });
item.Items.Add(new Item { Name = "A_3" });
Tree1.ItemsSource = new Collection<Item>() { item };
于 2011-04-25T04:52:36.943 に答える