Ich verwende MVVM in meiner WPF-Anwendung und ich habe ein Problem mit der Datenbindung. Ich überlege, Benutzeraktionen an Datenoperationen zu binden (in meinem Fall, Datensätze zur Datenbank hinzuzufügen). Wenn ich eine starke Kopplung zwischen CommandClass und ViewModelClass verwende, funktioniert alles einwandfrei. Mein CommandClass in diesem Fall wie folgt aussieht:Datenbindung in MVVM WPF OnButtonClick
private readonly ButtonCommand _buttonCommand;
public UserViewModel()
{
_buttonCommand = new ButtonCommand(this);
}
public ICommand btnClick
{
get { return _buttonCommand; }
}
Meine XAML Kupplung auf die Schaltfläche klicken (werfen Sie einen Blick auf einen Befehlsabschnitt):
public class ButtonCommand : ICommand
{
private readonly UserViewModel _userViewModel;
public ButtonCommand(UserViewModel viewModel)
{
_userViewModel = viewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_userViewModel.AddUser();
}
public event EventHandler CanExecuteChanged;
}
Meine schwere Kupplung in ViewModelClass wie folgt aussieht
<Page.Resources>
<viewModel:UserViewModel x:Key="UserObj" TxtFirstName="" TxtLastName="" TxtEmail="" TxtPassword=""/>
</Page.Resources>
....
<Button Content="Submit" HorizontalAlignment="Left" Margin="42,231,0,0" VerticalAlignment="Top" Width="75" Command="{Binding btnClick, Mode=OneWay, Source={StaticResource UserObj}}"/>
Und ich habe eine solche Ausgabe (werfen Sie einen Blick auf Senden Schaltfläche): Window.
Nachdem ich Änderungen an meiner CommandClass und ViewModelClass vorgenommen habe (um sie allgemeiner und wiederverwendbar zu machen), aber meine XAML-Kopplung gleich bleibt, ist die Submit-Schaltfläche nach dem Ausführen meiner Anwendung nicht mehr verfügbar. Nach Änderungen sieht CommandClass wie folgt aus:
public class ButtonCommand : ICommand
{
private readonly Action _executionMethod;
private readonly Func<bool> _executeOrNot;
public ButtonCommand(Action executionMethod, Func<bool> executeOrNot)
{
_executionMethod = executionMethod;
_executeOrNot = executeOrNot;
}
public bool CanExecute(object parameter)
{
return _executeOrNot();
}
public void Execute(object parameter)
{
_executionMethod();
}
public event EventHandler CanExecuteChanged;
}
Meine ViewModelClass nach Änderungen:
private readonly ButtonCommand _buttonCommand;
public UserViewModel()
{
_buttonCommand = new ButtonCommand(AddUser, IsValidInputForRegistration);
}
public ICommand btnClick
{
get { return _buttonCommand; }
}
XAML ich die gleiche verlassen. Die Ausgabe, die ich habe, ist die nächste (werfen Sie einen Blick auf Senden): WindowWithChanges.
Kann mir jemand einige Informationen geben, warum der Button nicht verfügbar war und wo ich versaut habe?
Können Sie posten was 'IsValidInputForRegistration' tut? Hast du versucht, es immer "Return True" zu machen und zu sehen, ob dein Button aktiviert wird? –
Ja, natürlich. – Bill
public bool IsValidInputForRegistration() { return! String.IsNullOrEmpty (txtFirstName) &&! String.IsNullOrEmpty (txtLastName) &&! String.IsNullOrEmpty (TxtEmail) &&! String.IsNullOrEmpty (TxtPassword); } – Bill