2016-09-22 13 views
0

Ich habe einen MainWindow.xaml, die wie unten aussieht:Zugriff auf eine DependencyProperty des untergeordneten Benutzersteuerelements in WPF/MVVM?

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

Mein DisplayDataUserControl verwendet ein anderes Usercontrol treeUserControl genannt. Ich habe das treeUserControl erstellt, damit ich es überall in meiner WPF-App wiederverwenden kann.

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

Und die treeUserControl ist ein Benutzersteuerelement, das durch Baumdaten zeigt TreeView mit einem DependecyPropety (SelectedItem_), die sich, wie unten definiert:

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

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)); 
} 

Kann ich auf die Viewmodel-Eigenschaft MyTreeSelectedItem von treeUserControl in DisplayDataUserControl zugreifen, damit die Detailinformationen zur ausgewählten Strukturansicht angezeigt werden können?

Antwort

0

Ihre Bindungshierarchie sieht falsch aus.

Was haben Sie sieht jetzt

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

zu sein, was Sie etwas davon haben sollte, ist:

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

In diesem zweiten Beispiel die .DataContext Ihrer TabItem, TreeUserControl und ExtendedTreeView werden alle sind SelectedItem (die einer der Artikel in der Items Sammlung sein wird) wegen der Art und Weise the DataContext is by default inherited from the parent object.

Ich realisiere, dass Sie Items in der ExtendedTreeView verwenden und ich verwende es in der TabControl, aber ohne die richtige Struktur Ihrer Anwendung zu kennen, kann ich Ihnen keine Vorschläge dort anbieten. Dies sollte Ihnen hoffentlich eine Vorstellung davon geben, was Sie falsch machen, damit Sie es korrigieren können.

+0

Wie in meinem OP beschrieben, möchte ich dieses TreeUserControl an mehreren Stellen (wie ich 3 weitere Tabs hinzufügen) meiner Anwendung verwenden. Der eine Ort, an dem ich gerade arbeiten muss, ist im ersten Tab "Baumdetaildaten anzeigen". Dort werden nicht nur das Baumelement, sondern auch Details zum ausgewählten Objekt angezeigt. Ich habe eine andere Registerkarte, die ich hinzufügen werde, die auch dieses treeUserControl in seiner DataGrid-Zelle verwendet, um eine Auswahl zu treffen (genau wie ein Dropdown). Aus diesem Grund habe ich es Benutzerkontrolle gemacht und um das selecteditem zu erhalten habe ich die Dep-Eigenschaft hinzugefügt. Es gibt mehr Registerkarten, die nicht nur eins auftauchen. – krrishna

+0

Wir erstellen Mitarbeiterhierarchie mit wem wer wer meldet. In einem Tab ist unser Fokus nur die Hierarchie zu erstellen und auf einem anderen Tab zeigen wir Details des (Mitarbeiter-) Treenodes an. Auf einer anderen Registerkarte möchten wir die Titel der ausgewählten Mitarbeiter ändern, mit zwei Spalten, von denen einer den Mitarbeiter auswählt (wir verwenden den Baum hier erneut) und in einer anderen Spalte wählen wir den neuen Titel aus dem Drop-down-Menü aus Hintergrund über die App, die helfen kann, dieses Szenario zu verstehen. – krrishna

+1

@krrishna Das ist in Ordnung, wenn das der Fall ist, obwohl Sie die 'ExtendedTreeView'-Eigenschaften von der' TreeUserControl'-Ebene binden sollten (und weiter so in den Baum gehen). Der Punkt ist, dass die Daten hinter dem Steuerelement ('.DataContext') ** an ** das' TreeUserControl' übergeben werden und ** nicht von ** diesem Steuerelement stammen. Ich schreibe hier ständig die Antworten darauf, zum Beispiel [diese] (http://stackoverflow.com/a/16488618/302677) – Rachel

Verwandte Themen