2016-09-22 9 views
0

は、私のように見える以下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という名前でアクセスして、選択したツリービュー項目の詳細情報を表示できますか?

答えて

0

バインディング階層が正しくありません。この第二の例では、あなたのTabItem、TreeUserControl、およびExtendedTreeView意志の.DataContext

<TabControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}"> 
    <TabItem>     <!-- DataContext is SelectedItem --> 
     <TreeUserControl>  <!-- DataContext is SelectedItem --> 
      <ExtendedTreeView /> <!-- DataContext is SelectedItem --> 
     </TreeUserControl> 
    </TabItem> 
    ... 
</TabControl> 

:あなたは今、このようなものであるあなたが持っている必要があり

<TabControl> 
    <TabItem> 
     <TreeUserControl> 
      <ExtendedTreeView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 
     </TreeUserControl> 
    </TabItem> 
    ... 
</TabControl> 

何になりそうだ持っているもの

すべてSelectedItemItemsコレクションのアイテムの1つになります)the DataContext is by default inherited from the parent objectのためです。

ExtendedTreeViewItemsを使用しており、TabControlで使用していますが、アプリケーションの正しい構造を知らないと、そこに提案はできません。これはうまくいけば何をしているのかを知ることができますので、修正することができます。

+0

私のOPで説明したように、私はいくつかの場所でこのTreeUserControlを使用したい(私は3つのタブを追加するつもりだから)私のアプリケーションの。私が現在使用する必要がある1つの場所は、ツリーアイテムだけでなく、選択されたアイテムの詳細も表示する最初のタブの "Display Tree Data Details" "です。私は、DataGridセルでこのtreeUserControlを使用して項目を選択する(ドロップダウンのように)、追加しようとしている別のタブを持っています。このため、私はそれをユーザーコントロールにして、選択された項目を取得するために、Depプロパティを追加しました。 – krrishna

+0

従業員の階層を作成し、誰に報告するか。 1つのタブでは、階層を作成するだけで、別のタブで(従業員)ツリーノートの詳細を表示します。別のタブでは、従業員を選択するための列(ここではツリーを使用します)とドロップダウンから新しいタイトルを選択する別の列の2つの列を持つグリッドを使用して、選択した従業員の職種を変更します。このシナリオを理解するのに役立つアプリの背景。 – krrishna

+1

@krrishna 'TreeUserControl'レベルから' ExtendedTreeView'プロパティをバインドする必要がありますが、そのような場合はツリーを上にしておく必要があります。ポイントは、コントロールの後ろのデータ( '.DataContext')が** TreeUserControlに渡され、**がそのコントロールから生成されていないことです。私は、この[この1つ](http://stackoverflow.com/a/16488618/302677)のように、ここでいつも答えを書いています。 – Rachel

関連する問題