【发布时间】:2013-05-13 12:04:42
【问题描述】:
在我的 ViewModel 中,我有以下方法:
public async Task<Boolean> DoSomething(Button sender)
{
Binding binding = sender.GetBindingExpression(Button.IsEnabledProperty).ParentBinding;
sender.IsEnabled = false;
DoFastStuffs();
await Task.Delay(250);
sender.SetBinding(Button.IsEnabledProperty, binding);
return true;
}
有没有更好的方法来做到这一点?因为我注意到手动设置属性而不将绑定保存在某处会永远从 XAML 对象中删除实际绑定。
编辑:这是我的按钮:
<Button IsEnabled="{Binding Converter={StaticResource ObjectToBooleanConverter}, ElementName=ComboBox, Path=SelectedItem}"/>
【问题讨论】:
-
如果您有一个属性 (
Button.IsEnabled) 绑定到源属性(大概在您的 VM 上),那么您为什么不直接更改源属性呢?如果您已将按钮绑定到ICommand,那么您将更改CanExecute的返回值并提高CanExecuteChanged。 -
在虚拟机中操作绑定(几乎)总是错误的方式。
-
问题是 IsEnabled 属性绑定到 ComboBox 的 SelectedItem。然后没有选择任何项目,按钮被禁用,反之亦然。我真的应该创建一个 Multiconverter 和另一个通知属性来临时禁用按钮吗?
-
您的
Button是否绑定到Command?如果是这样,正确的方法可能是使用命令的CanExecute()返回false,如果SelectedItem是null或者IsLoading=true -
根据 MVVM 的视图模型不包含对视图的引用(在您的情况下为按钮) - 所以请不要将其称为 ViewModel。对于您的问题,请检查使用 MVVM(RelayCommand 或 DelegateCommand)进行指挥
标签: c# .net wpf xaml data-binding