Frage

Das muss einfach sein, zumindest war es im guten alten .Net, wo es vielleicht vier Zeilen Code brauchte.Ich arbeite in VS2010, C#, WPF4.

Ich habe ein Benutzersteuerelement mit einem Textfeld.Wenn ich im Hauptfenster auf eine Schaltfläche klicke, möchte ich, dass in meinem Textfeld für die Benutzersteuerung Text angezeigt wird.Ist dies in WPF4 mit weniger als 500 Zeilen esoterischem Code möglich?

Das Problem besteht darin, dass ich zwar weiß, dass das Textfeld den neuen Text erhält, wie aus den Haltepunkten im Benutzersteuerungscode hervorgeht, dieser Text jedoch nie im Hauptfenster wiedergegeben wird.Im Hauptfenster wird weiterhin der Originaltext angezeigt.Es muss eine Art verbindliche Sache sein, und ich glaube wirklich nicht, dass ich für diese einfache Situation Vorlagen und Ressourcen usw. erstellen muss.Es muss etwas Einfaches sein, das ich im Wald von WPF4 vergesse.Unten ist, was ich habe.Nachdem Sie auf die Schaltfläche geklickt haben, ist das Textfeld immer noch leer.Es heißt nicht „Hallo Erdlinge“.

Im Benutzersteuerungscode:

public partial class UserControl1 : UserControl
{
    public static readonly DependencyProperty TextProperty;

    public UserControl1()
    {
        InitializeComponent();
    }

    static UserControl1()
    {
        TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata(null));
    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

}

Benutzerkontroll-XAML:

<UserControl x:Class="WTFUserControlLibrary.UserControl1"
         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">
<Grid Height="164" Width="220">
    <TextBox Name="txtTest" BorderBrush="red" BorderThickness="2" Height="25" Text="{Binding ElementName=UserControl1, Path=Text, Mode=TwoWay}"></TextBox>
</Grid>

(Ich habe keine Ahnung, was die Textbindung in diesem Fall bewirken soll.)

Hauptfenstercode:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        WTFUserControlLibrary.UserControl1 uc = new WTFUserControlLibrary.UserControl1();
        uc.Text = "hello earthlings";
    }
}

und das Hauptfenster-XAML:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:WTFUserControlLibrary;assembly=WTFUserControlLibrary"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="71,65,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <my:UserControl1 HorizontalAlignment="Left" Margin="71,94,0,0" Name="userControl11" VerticalAlignment="Top" Height="116" Width="244" />
</Grid>

Danke, Erdlinge (und auch denen, die dieses Durcheinander verursacht haben!)

War es hilfreich?

Lösung

In deiner Methode button1_Click Du erschaffst ein neu Nutzerkontrolle.Dies ist nicht die Benutzersteuerung im Fenster und wird nie angezeigt.

Geben Sie Ihrem Benutzersteuerelement stattdessen einen Namen im XAML:

x:Name="uc"

Dann im button1_Click Bei dieser Methode entfernen Sie einfach die erste Zeile, in der Sie ein neues Benutzersteuerelement erstellen.

aktualisieren

Sie möchten, dass das Benutzersteuer-XAML eher so aussieht:

<UserControl x:Class="WTFUserControlLibrary.UserControl1"
         x:Name="thisControl"
         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">
<Grid Height="164" Width="220">
    <TextBox Name="txtTest" BorderBrush="red" 
             BorderThickness="2" Height="25" 
             Text="{Binding ElementName=thisControl, Path=Text, Mode=TwoWay}" />
</Grid>

Ich fügte hinzu x:Name="thisControl" bis zur Wurzel UserControl Element erstellt und dann in der Bindung darauf verwiesen.

Ich werde versuchen, die Bindung zu erklären:

Sie haben dieses Textfeld innen Ihr Benutzersteuerelement, aber Sie möchten den Textwert an etwas binden können draußen die Benutzersteuerung.Sie haben eine Abhängigkeitseigenschaft für das Benutzersteuerelement eingerichtet und das Textfeld daran gebunden, sodass Sie die Bindungswerte der Infrastrukturübergabe von der obersten Ebene des Steuerelements verwenden UserControl zu den darin enthaltenen Steuerelementen.

Im Grunde sieht es so aus:

data
    ---> bind UserControl1.Text to data
         ---> bind TextBox.Text to UserControl1.Text
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top