wpf Fody未更改按钮的行为,按钮未重新计算以查看是否可以按下

kr98yfug  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(115)

由于某种原因,我无法激活我的Button
在我的应用程序中,我有一个TextBox,用户从对话框中选择的文件路径会填充到它,我还有一个ComboBox让用户选择语言。
我想做的是,当FilePath不为空并且用户选择了一种语言时,激活我的按钮 Start
第一个

kb5ga3dv

kb5ga3dv1#

一个关键的问题是你同时使用CommandIsEnabled绑定。你应该只使用一个,因为它们会互相干扰。命令绑定将根据它的CanExceute方法的结果设置按钮的启用状态。绑定IsEnabled也是如此,我建议只使用命令,并将逻辑从CanPress移到StartCommandCanStartAction方法。

使用命令

命令发出信号,表示它们是否可以由其CanExecute方法结果执行。但是,有不同的命令实现,以不同的方式触发此方法的重新求值。

使用命令管理器中继命令

如果您使用的命令实现使用RequerySuggested事件,例如:

public event EventHandler CanExecuteChanged
{
   add { CommandManager.RequerySuggested += value; }
   remove { CommandManager.RequerySuggested -= value; }
}

然后删除IsEnabled绑定就足够了,因为它是由用户界面中的输入触发的。

带有显式方法的中继命令

另一个变体是命令实现,其中公开了一个方法以显式地重新计算其状态,例如RaiseCanExcuteChanged。在这种情况下,显式地引发CanExecuteChanged事件,并且触发绑定该命令的UI元素以再次执行CanExecute并更新其自己的启用状态。
遗憾的是,Fody PropertyChanged 库不支持会触发重新评估的命令的属性。已经有一个请求,但被拒绝,他们将不会实施该请求。

解决方法是创建On<Property>Changed方法,Fody会在相应的<Property>发生变化时自动调用这些方法,请参见On_PropertyName_Changed in the Wiki。然后,这些方法会调用显式重新求值方法。

public void OnSelectedItemChanged()
{
   StartCommand.RaiseCanExecuteChanged();
   Debug.WriteLine("SelectedItem Changed");
}

public void OnFilePathChanged()
{
   StartCommand.RaiseCanExecuteChanged();
   Debug.WriteLine("FilePath Changed");
}

使用IsEnabled

当只使用IsEnabled时,您必须将CanStartAction逻辑移到CanPress中执行。在这种情况下,这将是一个不能使用Fody的显式实现。

此外,您不能使用命令,因此Click处理程序将是一个丑陋的选择。这就是为什么我强烈建议您使用命令代替。

相关问题