2011-10-05 68 views
15

假设象下面这样的代码,如何在自定义控件中创建可绑定的命令?

public class SomeViewModel{ 
     ICommand ReloadCommand{get...} 
     ICommand SaveCommand{get..} 
} 

//SomeView.xaml 
<SomeCustomControl Reload="ReloadCommand" Save="SaveCommand" /> //NOT SURE HOW?? 

//SomeCustomContro.xaml 
<SomeCustomControl x:Name="someCustomControl"> 
<Button Command={Binding ElementName=someCustomControl, Path=Reload /> 
<Button Command={Binding ElementName=someCustomControl, Path=Save /> 
</SomeCustomControl> 

//SomeCustomControl.xaml.cs 
..... //NOT SURE HOW TO ALLOW BINDING TO A ICOMMAND ?? 

在我SomeCustomControl,我需要支持 “在XAML ICommand的结合”。 我明白DependencyProperties可以像这样绑定,但在这种情况下,我需要绑定ICommand。

有人可以请建议什么是最好的方法来做到这一点? 任何建议的材料或链接都可以使用,因为我错过了一个方向。

编辑1)我可以在SomeCustomControl中使用DataContext SomeView。两者之间有更多的逻辑和分离,我无法解散。我必须在我的SomeCustomControl的某处保留一个Reload/Save ICommands的引用。

非常感谢。

回答

31

让我直接告诉你,你想绑定到ReloadSave对不对?

所以需要创建,声明和定义两个依赖属性ReloadCommandPropertyICommandSaveCommandPropertySomeCustomControl

所以假设SomeCustomControlControl派生...

public class SomeCustomControl : Control 
{ 
    public static DependencyProperty ReloadCommandProperty 
     = DependencyProperty.Register(
      "ReloadCommand", 
      typeof (ICommand), 
      typeof (SomeCustomControl)); 

    public static DependencyProperty SaveCommandProperty 
     = DependencyProperty.Register(
      "SaveCommand", 
      typeof(ICommand), 
      typeof(SomeCustomControl)); 

    public ICommand ReloadCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(ReloadCommandProperty); 
     } 

     set 
     { 
      SetValue(ReloadCommandProperty, value); 
     } 
    } 

    public ICommand SaveCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(SaveCommandProperty); 
     } 

     set 
     { 
      SetValue(SaveCommandProperty, value); 
     } 
    } 
} 

在此之后适当结合RelodCommandSaveCommand属性将开始工作......

 <SomeCustomControl RelodCommand="{Binding ViewModelReloadCommand}" 
         SaveCommand="{Binding ViewModelSaveCommand}" /> 
2

创建一个属性,该属性将返回您的命令并在需要时绑定此属性。

private ICommand _reloadCommand; 
public ICommand ReloadCommand 
{ 
    get 
    { 
    if(_reloadCommand == null) _reloadCommand = CreateReloadCommand(); 
    return _reloadCommand; 
    } 
} 

改变你的代码的结合,

<Button Command={Binding ReloadCommand}" /> 

,并绑定自定义控件的DataContext到包含的命令视图模型。

+0

你的意思是我可以直接绑定ICommand实例到控件中的属性?另外,什么是“CreateReloadCommand”?这个命令实例将在ViewModel中创建,并且SomeCustomControl只需要存储该实例引用(使用xaml绑定)。 –

+0

你可以将ICommand类型的值绑定到任何你想要的,绑定最有意义的依赖属性是'ButtonBase.CommandProperty'。 'CreateReloadCommand'是创建你的命令的方法 - 我不想编写命令创建和初始化代码。当我键入我的答案时,您的代码中有命令的方法(稍后您已更改它们)。 –