2016-06-03 18 views
0

Ich habe eine usercontrol (eine Bezeichnung und ein Textfeld. Ich möchte den Text des Benutzersteuerelements an die Eigenschaft Name aus einer DTO-Klasse Employee (Employee.Name) binden, wo ist verbindlich set im Hauptfenster, außerhalb des Usercontrol. das ist mein Usercontrol (Blick auf die Kontrollen Label und Text)wpf bind usercontrol -Eigenschaft zu datacontext von mainwondow

<UserControl x:Class="TestCompany.controls.textEdit" 
     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" 
     xmlns:local="clr-namespace:TestCompany.controls" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

<Grid > 
    <Grid.RowDefinitions> 
     <RowDefinition Height="60" /> 
     <RowDefinition MinHeight="50" /> 
    </Grid.RowDefinitions> 
    <Label Name="label" Content="{Binding Caption}" Grid.Row="0" FontSize="35" FontWeight="Light"/> 
    <TextBox Name="textbox" Text="{Binding Text}" Grid.Row="1" FontSize="33" Background="White" /> 
</Grid> 

Bildunterschrift ist der Titel der Kontrolle und Text displ dem Wert

ays Und hier ist der Code hinter

public string Caption 
    { 
     get 
     { 
      return (string)GetValue(CaptionProperty); 
     } 

     set 
     { 
      SetValue(CaptionProperty, value);     
     } 
    } 

    public static DependencyProperty CaptionProperty = 
     DependencyProperty.Register("Caption", typeof(string), typeof(textEdit), null); 


    public string Text 
    { 
     get 
     { 
      return (string)GetValue(TextProperty);     
     } 

     set 
     { 
      SetValue(TextProperty, value);     
     } 
    } 

    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(textEdit), null); 

nun im Hauptfenster, das ist, wie ich mein benutzerdefiniertes Steuerelement

<controls:textEdit Caption="Name" Text="{Binding Name}" Grid.Column="0" HorizontalAlignment="Stretch" Margin="0,0,20,0" /> 

Dann im Hauptfenster, aus der Liste der Mitarbeiter, ich nehme die ausgewählte und ich ordne es dem Kontext

this.DataContext = EmployeeObject; // Name = "Joe" 

Aber die Text-Eigenschaft von Der usercontrol zeigt nicht "Joe" an. Selbst der Setter der Immobilie wird nie genannt. Die seltsame ist, dass, wenn im Konstruktor meines Usercontrol I dieses zuweisen UserControl.Datacontext nicht zu

DataContext = this; // within the constructor of UserControl 

dann auch das Label-Steuerelement leer ist (das Label der Steuerung an die Caption-Abhängigkeitseigenschaft verknüpft). Ich habe unzählige ähnliche Probleme auf StackOverflow und wo sonst gesehen. (RelativeSource Self usw.). Nichts funktioniert ... Die Eigenschaft Text meiner Benutzersteuerung nicht Wert anzeigt von dem Datacontext-Set im Hauptfenster ...

Jede Hilfe wäre sehr dankbar

+0

Mögliches Duplikat von [Binding to UserControl DependencyProperty] (http://stackoverflow.com/questions/16985382/binding-to-usercontrol-dependencyproperty); Lesen Sie auch Kommentare zu DataContext unter akzeptierter Antwort – ASh

+0

Danke für den Vorschlag. Ich habe die dort bereitgestellte Lösung angewendet. Der Text zeigt den Wert korrekt an. Aber das Label ist jetzt leer – TheSoul

+0

Können Sie den Code bei der Erstellung des EmployeeObject einschließen? – tgpdyk

Antwort

1

Sie benötigen die DataContext der UserControl einstellen zu das von Ihrem Hauptfenster und DataContext von Grid zu UserControl. Das bedeutet, dass wenn der UserControl nach seinen Daten sucht, er im DataContext aussieht, den er von MainWindow erbt, aber wenn Ihr Grid nach seinen Daten sucht, sieht er innerhalb des UserControl aus. Sie tun es wie folgt aus:

<UserControl ... 
    d:DesignHeight="300" d:DesignWidth="300" 
    x:Name="ThisControl"> 

<Grid DataContext="{Binding ElementName=ThisControl}"> 
... 

http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight.html See.

+0

Danke. Ich habe getan, was du gesagt hast. Ich habe ein DataContext im Grid innerhalb des UserControls definiert. Immer noch bindet der Text korrekt. Aber das Etikett ist noch leer. – TheSoul

+0

Ok, jetzt funktioniert es. Danke für Ihre Hilfe! – TheSoul

+0

Großartig. Dieser Artikel gab mir einen Einblick in DataContext. – PScr

Verwandte Themen