2009-07-16 37 views
2

我有一个按钮条usercontrol,我想在我的大多数表单上都有。WPF - CanExecute dosn't在从UserControl提升命令时触发

我已经添加的命令如下...

public ICommand Create 
    { 
     get 
     { 
      return buttonCreate.Command; 
     } 
     set 
     { 
      buttonCreate.Command = value; 
     } 
    } 

我已经设置这些为依赖属性,所以我可以绑定到他们...

 public static readonly DependencyProperty CreateCommandProperty = 
     DependencyProperty.Register(
     "Create", 
     typeof(ICommand), 
     typeof(StandardButtonStrip), 
     new PropertyMetadata((ICommand)null)); 

我再结合我的用户的命令

<commoncontrols:StandardButtonStrip HorizontalAlignment="Stretch" Create="{Binding CreateCommand}" /> 

我设置命令如下...

_viewModel.CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate); 

但尽管事实上,我总是在我的CanCreate方法上返回true,但该按钮被禁用......如果我在返回时放置一个断点,它永远不会触发!

public bool CanCreate(object parm) 
    { 
     return true; 
    } 

我试过这个看看它是否会刷新绑定,但没有快乐!

_viewModel.CreateCommand.RaiseCanExecuteChanged(); 

我认为这个问题是下到用户的控制,以及如何我传递的命令,作为一个财产,但不知道...

谁能帮助?

干杯,

安迪

回答

5

这看起来的样子,你有一个视图模型依赖项属性。如果你真的在使用MVVM,那肯定不是它的方法(不是因为信奉宗教,而是因为它不是最佳的方式)。

首先,你的视图模型是一个DependencyObject?

如果是,则应将其降级为实现INotifyPropertyChanged的类。为什么?因为Button的Command属性是一个DependencyProperty本身(继承自ButtonBase)并且已经支持数据绑定。

如果不是,那么它的依赖属性将不起作用,这很好,因为你的视图模型首先不应该有依赖属性。

你应该怎么做,是视图模型作为控件的DataContext(我猜你已经有了这个设置)。然后,更改您的视图模型的CreateCommand为纯ICommand的,和createButton的Command属性绑定像这样(在默认StandardButtonStrip风格)

<Button Name="createButton" HorizontalAlignment="Stretch" Command="{Binding CreateCommand}" /> 

这样,它仍然是可重复使用的,你只需要确保任何视图你与用户控件关联的模型有一个属性为CreateCommand的ICommand类型(并且该视图模型将被默认继承到按钮控件 - 这是wpf家伙认为最好的事情之一)。

所以要回顾一下,你应该以相反的方式做,或多或少。

希望这有帮助,欢呼声。

+0

谢谢,这工作的一种享受! – 2009-07-16 11:36:19

0

你是否重写了任何用户控件的功能?

一个常见问题是在不调用基本实现的情况下重写方法。例如,如果您在不致电base.OnContentChanged()的情况下覆盖了OnContentChanged(),则可能意外地抑制了ContentChanged事件的解雇。

1

一个需要注意的接受的答案 -

使用委托命令我只能得到这个,如果我创建了一个新

Command<T> : DelegateCommand<T>并迷上了命令管理工作。

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

这真的很重要。花了差不多一个小时,因为错过了。 – Tobias 2012-05-31 10:42:36