In meiner Ansicht habe ich eine Schaltfläche.Wie gebe ich die Informationen von View zu ViewModel mit DelegateCommand?
Wenn der Benutzer auf diese Schaltfläche klickt, möchte ich, dass das ViewModel den Kontext des TextBlock in der Datenbank speichert.
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock Text="{Binding FirstName}"/>
<TextBox Text="Save this text to the database."/>
<Button Content="Save" Command="{Binding SaveCommand}"/>
</StackPanel>
Doch mein DelegateCommand in meinem Ansichtsmodell, das „Save()“ Methode übergibt keine Argumente, so wie bekomme ich Daten aus der Sicht zu diesem Zeitpunkt?
#region DelegateCommand: Save
private DelegateCommand saveCommand;
public ICommand SaveCommand
{
get
{
if (saveCommand == null)
{
saveCommand = new DelegateCommand(Save, CanSave);
}
return saveCommand;
}
}
private void Save()
{
TextBox textBox = ......how do I get the value of the view's textbox from here?....
}
private bool CanSave()
{
return true;
}
#endregion
Ich löste mein Problem tatsächlich, indem ich die TextBox an eine ViewModel-Eigenschaft (INotifyPropertyChanged) gebunden habe, auf deren Wert natürlich der Save() -Befehl zugreifen kann, aber Ihre Vorschläge sind sehr interessant, werden sie auschecken. –
Es gibt einen bestimmten (und einigermaßen gebräuchlichen) Anwendungsfall, bei dem Matts Lösung definitiv den Zugriff auf einen separaten gebundenen Wert gewinnt: Befehle, die von einem 'ItemsControl' ausgeführt werden. Hier kann beispielsweise ein Button in einer 'ListView' seinen' DataContext' als Parameter verwenden und das Element, auf das der Button geklickt wurde, wird zusammen mit dem Befehl übergeben. Es ist schwierig herauszufinden, auf welches der vielen Elemente der Button sonst geklickt wurde. –
Beachten Sie, dass das generische 'DelegateCommand' eine wichtige Einschränkung hat (die erst zur Laufzeit abgerufen wird - der Compiler wird sich nicht beschweren): Sie können keinen Werttyp als Parameter verwenden. Der offizielle Ratschlag ist, einen Nullwerttyp zu verwenden (was erlaubt ist) und vor der Verwendung zu prüfen, ob er einen Wert enthält (https://msdn.microsoft.com/en-us/library/gg431410%28v=pandp.50%29 .aspx - siehe Abschnitt "Bemerkungen". –