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