[英]Data binding in MVVM WPF OnButtonClick
我在WPF應用程序中使用MVVM,但數據綁定出現問題。 我正在考慮將用戶操作綁定到數據操作(在我的情況下,將記錄添加到數據庫)。 如果我在CommandClass和ViewModelClass之間使用重耦合,則一切正常。 在這種情況下,我的CommandClass如下所示:
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;
}
我在ViewModelClass中的沉重耦合看起來像這樣:
private readonly ButtonCommand _buttonCommand;
public UserViewModel()
{
_buttonCommand = new ButtonCommand(this);
}
public ICommand btnClick
{
get { return _buttonCommand; }
}
單擊按鈕時的XAML耦合(請查看“命令”部分):
<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}}"/>
我有這樣的輸出(看一下Submit按鈕): Window 。
在對CommandClass和ViewModelClass進行更改(以使其更加通用和可重用)之后,但在運行應用程序后,將XAML耦合保持不變,則Submit按鈕變得不可用。 更改后,CommandClass如下所示:
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;
}
更改后我的ViewModelClass:
private readonly ButtonCommand _buttonCommand;
public UserViewModel()
{
_buttonCommand = new ButtonCommand(AddUser, IsValidInputForRegistration);
}
public ICommand btnClick
{
get { return _buttonCommand; }
}
XAML我保持不變。 接下來是我的輸出(看一下Submit按鈕): WindowWithChanges 。
誰能為我提供一些信息,為什么按鈕不可用以及我在哪里弄糟?
首先,嘗試IsValidInputForRegistration
始終return true
。 這將證明你的執行IButton
(即你的ButtonCommand
類)工作正常。
如果這樣IsValidInputForRegistration
,則您的程序正在發生的事情是_buttonCommand
在initialization
期間傳遞了IsValidInputForRegistration
的state
,由於它不query
IsValidInputForRegistration
是否已更改狀態,因此它將保持在該狀態。
為了實現狀態查詢,您可以像這樣實現EventHandler CanExecuteChanged
:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
您可以查看msdn中CommandManager.RequerySuggested
作用。 但是我認為描述說明了一切。 :)
當CommandManager檢測到可能改變命令執行能力的條件時發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.