は、私のように見える以下MainWindow.xaml
を持っている:WPF/MVVMで子ユーザコントロールのDependencyPropertyにアクセスする方法は?
<TabControl TabStripPlacement="Left">
<TabItem Header="Display Tree Data Details" HorizontalAlignment="Left">
<uControls:DisplayDataUserControl />
</TabItem>
<TabItem Header="Configuration" HorizontalAlignment="Left">
------
</TabItem>
<TabItem Header="About" HorizontalAlignment="Left">
------
</TabItem>
<TabItem Header="Sponsors" HorizontalAlignment="Left">
------
</TabItem>
</TabControl>
マイDisplayDataUserControl
は、別のユーザーコントロールがtreeUserControl
と呼ばれる使用しています。私はtreeUserControlを作りました。私はWPFアプリケーションでどこでもそれを再利用することができます。
<UserControl x:Class="WpfApplication2.DisplayDataUserControl "
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
x:Name="thisUC"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<local:treeUserControl />
<Grid>
<!-- display the details of the selected treeviewitem from "treeUserControl" here. -->
</Grid>
</Grid>
</UserControl>
そしてtreeUserControl
は、以下に定義されるように、DependecyPropety(SelectedItem_
)とTreeView
を拡張することにより、ツリーデータを表示するユーザーコントロールである:
<UserControl x:Class="WpfApplication2.treeUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
x:Name="thisUC"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<local:ExtendedTreeView ItemsSource="{Binding Items}"
SelectedItem_="{Binding MyTreeSelectedItem, Mode=TwoWay}">
.....
</local:ExtendedTreeView>
</Grid>
たDependencyProperty定義:
public class ExtendedTreeView : TreeView
{
public ExtendedTreeView() : base()
{
this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH);
}
void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (SelectedItem != null)
{
SetValue(SelectedItem_Property, SelectedItem);
}
}
public object SelectedItem_
{
get { return (object)GetValue(SelectedItem_Property); }
set { SetValue(SelectedItem_Property, value); }
}
public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
}
TreeUserControlのMyTreeSelectedItem
viewmodelプロパティーにDisplayDataUserControl
という名前でアクセスして、選択したツリービュー項目の詳細情報を表示できますか?
私のOPで説明したように、私はいくつかの場所でこのTreeUserControlを使用したい(私は3つのタブを追加するつもりだから)私のアプリケーションの。私が現在使用する必要がある1つの場所は、ツリーアイテムだけでなく、選択されたアイテムの詳細も表示する最初のタブの "Display Tree Data Details" "です。私は、DataGridセルでこのtreeUserControlを使用して項目を選択する(ドロップダウンのように)、追加しようとしている別のタブを持っています。このため、私はそれをユーザーコントロールにして、選択された項目を取得するために、Depプロパティを追加しました。 – krrishna
従業員の階層を作成し、誰に報告するか。 1つのタブでは、階層を作成するだけで、別のタブで(従業員)ツリーノートの詳細を表示します。別のタブでは、従業員を選択するための列(ここではツリーを使用します)とドロップダウンから新しいタイトルを選択する別の列の2つの列を持つグリッドを使用して、選択した従業員の職種を変更します。このシナリオを理解するのに役立つアプリの背景。 – krrishna
@krrishna 'TreeUserControl'レベルから' ExtendedTreeView'プロパティをバインドする必要がありますが、そのような場合はツリーを上にしておく必要があります。ポイントは、コントロールの後ろのデータ( '.DataContext')が** TreeUserControlに渡され、**がそのコントロールから生成されていないことです。私は、この[この1つ](http://stackoverflow.com/a/16488618/302677)のように、ここでいつも答えを書いています。 – Rachel