Ich versuche WPF/MVVM zu lernen, und aus pädagogischen Gründen erstelle ich eine einfache Anwendung. Ich habe einige Probleme bei der Implementierung eines Command Object
.Implementieren Sie ein Befehlsobjekt, das eine Eigenschaft in meinem Viewmodel ändert
Wenn ein Button-Steuerelement angeklickt wird, möchte ich die Hintergrundfarbe des Grid ändern mit einem Command Object
gelb. Es gibt eine Menge Dinge darüber, wie man das macht, aber ich möchte es auf die saubere Art machen. Im Allgemeinen möchte ich eine lose Kopplung zwischen View
, ViewModel
und der Command Object
erreichen, um diese Klassen zu testen.
Auch ich möchte nicht einige Bibliotheken wie Prism
verwenden, weil ich die MVVM zuerst vollständig verstehen muss.
Ich habe ein Codebeispiel, aber es hat natürlich keine Funktionalität. Stellte es einfach aus Bequemlichkeitsgründen vor.
Meine Ansicht XAML
<Window x:Class="Calendar.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Calendar"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="480">
<Grid Background="{Binding BackgroundColour}" Margin="0,0,2,0">
<Button Margin="197,247,200,-239" Grid.Row="3" Grid.ColumnSpan="2" Command="{Binding SubmitCommand}">Color</Button>
</Grid>
Meine Modelview Klasse
public class MainWindowViewModel : INotifyPropertyChanged {
//Command part
ICommand SubmitCommand;
public MainWindowViewModel(ICommand command) {
SubmitCommand = command;
}
//Data Binding part
public event PropertyChangedEventHandler PropertyChanged;
private Brush backgroundColour = (Brush)new BrushConverter().ConvertFromString("Red");
public Brush BackgroundColour {
get { return this.backgroundColour; }
set {
if (value != this.backgroundColour) {
this.backgroundColour = value;
var handler = this.PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs("BackgroundColour"));
}
}
}
(es hat auch einen Bindungsteil Daten, aber es muss nicht mit meinem Problem zu tun)
Subeamanian Ihre bereitgestellten Code haben eine Menge Zeug, geben Sie mir etwas Zeit, um einen Blick, und ich werde mit Fragen zurückkommen. – dios231
bei dieser Zeile 'SubmitCommand = new BaseCommand (Execute);' Wo ist es bei 'ViewModel' Konstruktor, wie das' ViewModel' über die 'Execute' Abhängigkeit weiß? – dios231
Verweisen Sie auf die Basisbefehlsklasse. Dies ist eine übliche Implementierung von ICommand, bei der Sie keine separate Klasse zur Implementierung Ihrer Befehle verwenden müssen. Angenommen, in einer Seite, wenn Sie 5 Schaltfläche haben, müssen Sie nicht 5 Klassen erstellen, um die Klicklogik zu verarbeiten, und Sie können auch verhindern, dass Viewmodel-Informationen an die Befehlsklasse übergeben werden. BaseCommand wird eine Aktion haben, die eine Methode in Ihrem Viewmodel aufruft. Es ist eine glatte Art, Befehle zu handhaben. –