Frage

Ich verfolge die M-V-VM Muster für meine WPF-Benutzeroberfläche.Ich möchte einen Befehl mit dem TextChanged-Ereignis einer TextBox mit einem Befehl verknüpfen, der sich in meiner ViewModel-Klasse befindet.Die einzige Möglichkeit, die ich mir vorstellen kann, diese Aufgabe zu erledigen, besteht darin, vom TextBox-Steuerelement zu erben und ICommandSource zu implementieren.Ich kann dann anweisen, dass der Befehl vom TextChanged-Ereignis ausgelöst wird.Das scheint zu viel Arbeit für etwas zu sein, das so einfach zu sein scheint.

Gibt es eine einfachere Möglichkeit (als die TextBox in eine Unterklasse zu unterteilen und ICommandSource zu implementieren), das TextChanged-Ereignis mit meiner ViewModel-Klasse zu verknüpfen?

War es hilfreich?

Lösung

First off, haben Sie sicherlich Zweiweg-Daten zu betrachten Ihre Viewmodel-Bindung, mit einem Update von Property? Auf diese Weise Eigentum Setter der Eigenschaft, die Sie binden jedes Mal, wenn der Text geändert wird aufgerufen wird?

Wenn das nicht genug ist, dann würde ich dieses Problem mit beiliegendem Behaviors bewältigen. Auf Julian Dominguez Blog finden Sie eine Artikel finden darüber, wie etwas sehr ähnlich in Silverlight zu tun, die WPF leicht anpassbar sein sollte.

Im Grunde genommen in einer statischen Klasse (genannt, sagt TextBoxBehaviours) Sie eine angefügte Eigenschaft (vielleicht) TextChangedCommand vom Typ ICommand genannt definieren. Schalte einen OnPropertyChanged Handler für diese Eigenschaft, und innerhalb des Handlers, überprüfen, dass die Eigenschaft auf einem TextBox gesetzt wird; wenn es ist, fügen Sie einen Handler an das Textchanged-Ereignis auf dem Textfeld, das den Befehl in der Eigenschaft angegeben rufen.

Dann vorausgesetzt, Ihr Viewmodel auf die Datacontext Ihrer Ansicht zugewiesen wurde, möchten Sie es verwenden:

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />

Andere Tipps

Mit der Ereignisbindung und Befehlsmethode möglicherweise nicht das Richtige zu verwenden. Was genau wird dieser Befehl tun?

Sie können mit einer Datenbindung zu einem String-Feld in Ihrem VM zu betrachten. So kann man eher einen Anruf an einem Befehl oder eine Funktion von dort aus machen kann die UI Pflege überhaupt als mit.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}

Können Sie nicht nur das Ereignis Textchanged behandeln und den Befehl von dort ausführen?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

Die Alternative, wie Sie sagen, ist eine TextBox zu erstellen, die als Befehlsquelle wirkt, aber das übertrieben scheint, es sei denn, es ist etwas, das Sie auf den Austausch planen und an vielen Orten nutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top