由于某种原因,我无法激活我的Button。在我的应用程序中,我有一个TextBox,用户从对话框中选择的文件路径会填充到它,我还有一个ComboBox让用户选择语言。我想做的是,当FilePath不为空并且用户选择了一种语言时,激活我的按钮 Start。第一个
Button
TextBox
ComboBox
FilePath
kb5ga3dv1#
一个关键的问题是你同时使用Command和IsEnabled绑定。你应该只使用一个,因为它们会互相干扰。命令绑定将根据它的CanExceute方法的结果设置按钮的启用状态。绑定IsEnabled也是如此,我建议只使用命令,并将逻辑从CanPress移到StartCommand的CanStartAction方法。
Command
IsEnabled
CanExceute
CanPress
StartCommand
CanStartAction
命令发出信号,表示它们是否可以由其CanExecute方法结果执行。但是,有不同的命令实现,以不同的方式触发此方法的重新求值。
CanExecute
如果您使用的命令实现使用RequerySuggested事件,例如:
RequerySuggested
public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } }
然后删除IsEnabled绑定就足够了,因为它是由用户界面中的输入触发的。
另一个变体是命令实现,其中公开了一个方法以显式地重新计算其状态,例如RaiseCanExcuteChanged。在这种情况下,显式地引发CanExecuteChanged事件,并且触发绑定该命令的UI元素以再次执行CanExecute并更新其自己的启用状态。遗憾的是,Fody PropertyChanged 库不支持会触发重新评估的命令的属性。已经有一个请求,但被拒绝,他们将不会实施该请求。
RaiseCanExcuteChanged
CanExecuteChanged
解决方法是创建On<Property>Changed方法,Fody会在相应的<Property>发生变化时自动调用这些方法,请参见On_PropertyName_Changed in the Wiki。然后,这些方法会调用显式重新求值方法。
On<Property>Changed
<Property>
public void OnSelectedItemChanged() { StartCommand.RaiseCanExecuteChanged(); Debug.WriteLine("SelectedItem Changed"); } public void OnFilePathChanged() { StartCommand.RaiseCanExecuteChanged(); Debug.WriteLine("FilePath Changed"); }
当只使用IsEnabled时,您必须将CanStartAction逻辑移到CanPress中执行。在这种情况下,这将是一个不能使用Fody的显式实现。
此外,您不能使用命令,因此Click处理程序将是一个丑陋的选择。这就是为什么我强烈建议您使用命令代替。
Click
1条答案
按热度按时间kb5ga3dv1#
一个关键的问题是你同时使用
Command
和IsEnabled
绑定。你应该只使用一个,因为它们会互相干扰。命令绑定将根据它的CanExceute
方法的结果设置按钮的启用状态。绑定IsEnabled
也是如此,我建议只使用命令,并将逻辑从CanPress
移到StartCommand
的CanStartAction
方法。使用命令
命令发出信号,表示它们是否可以由其
CanExecute
方法结果执行。但是,有不同的命令实现,以不同的方式触发此方法的重新求值。使用命令管理器中继命令
如果您使用的命令实现使用
RequerySuggested
事件,例如:然后删除
IsEnabled
绑定就足够了,因为它是由用户界面中的输入触发的。带有显式方法的中继命令
另一个变体是命令实现,其中公开了一个方法以显式地重新计算其状态,例如
RaiseCanExcuteChanged
。在这种情况下,显式地引发CanExecuteChanged
事件,并且触发绑定该命令的UI元素以再次执行CanExecute
并更新其自己的启用状态。遗憾的是,Fody PropertyChanged 库不支持会触发重新评估的命令的属性。已经有一个请求,但被拒绝,他们将不会实施该请求。
解决方法是创建
On<Property>Changed
方法,Fody会在相应的<Property>
发生变化时自动调用这些方法,请参见On_PropertyName_Changed in the Wiki。然后,这些方法会调用显式重新求值方法。使用IsEnabled
当只使用
IsEnabled
时,您必须将CanStartAction
逻辑移到CanPress
中执行。在这种情况下,这将是一个不能使用Fody的显式实现。此外,您不能使用命令,因此
Click
处理程序将是一个丑陋的选择。这就是为什么我强烈建议您使用命令代替。