WPF MVVM CanExecute方法实现问题
本文关键字:实现 问题 方法 CanExecute MVVM WPF | 更新日期: 2023-09-27 18:01:45
我正在尝试实现一个WPF MVVM应用程序。我是这个平台的初学者。我所需要的就是为我的SaveCommand
实现一个CanExecute方法代码
WPF XML代码
<Canvas Height="283" Name="canvas1" Width="321">
<Label Canvas.Left="6" Canvas.Top="6" Content="First Name" Height="25" Width="91" />
<Label Canvas.Left="6" Canvas.Top="37" Content="Last Name" Height="25" Width="91" />
<TextBox Canvas.Left="103" Canvas.Top="10" Height="21" Width="199" Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Canvas.Left="103" Canvas.Top="37" Height="21" Width="199" Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}"/>
<Button Canvas.Left="228" Canvas.Top="241" Content="Save" Height="23" Width="74" Command="{Binding SaveCommand}" />
<TextBlock Canvas.Left="28" Canvas.Top="110" Height="19" Width="259" Text="{Binding Path=FullName}"/>
</Canvas>
c# ViewModel代码
public CustomerViewModel(IEventAggregator eventAggregator, IUnityContainer container, ILoggerFacade logger)
: base(eventAggregator, container, logger)
{
logger.Log("View Model Initialized", Category.Debug, Priority.None);
InitializeCommands();
}
public DelegateCommand<object> SaveCommand { get; set; }
private string firstName;
public string FirstName
{
get { return firstName; }
set {
firstName = value;
RaisePropertyChanged("FirstName");
}
}
private string lastName;
public string LastName
{
get { return lastName; }
set {
lastName = value;
RaisePropertyChanged("LastName");
}
}
private string fullName;
public string FullName
{
get { return fullName; }
set {
fullName = value;
RaisePropertyChanged("FullName");
}
}
private void InitializeCommands()
{
SaveCommand = new DelegateCommand<object>(OnSaveCommand, CanSaveExcute);
}
private bool CanSaveExcute(object obj)
{
if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
return false;
return true;
}
private void OnSaveCommand(object obj)
{
FullName = FirstName + " " + LastName;
}
没有can cansaveexecute,它工作得很好。设置cansaveexecute后,按钮保持禁用状态,在文本更改时不启用。据我所知,这是一条正确的路。
请告诉我我做错了什么。
谢谢
您还应该引发"CanExecuteChanged"事件,否则接收器将不得不永久地重新访问您的命令,以确定它是否可以执行。您可以使用"RaiseCanExecuteChanged"方法,在这里描述
编辑如果您不介意开销,您可以在属性设置器中调用RaisePropertyChanged("FullName");
之后调用this.SaveCommand.RaiseCanExecuteChanged()
。如果您的RaisePropertyChanged
方法是虚拟的,您可以将RaiseCanExecuteChanged()
放在它们的