如何在自定义控件中创建可绑定命令?

时间:2011-10-05 11:26:03

标签: wpf xaml binding

假设代码如下,

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的引用。

非常感谢。

2 个答案:

答案 0 :(得分:37)

让我直截了当,你想绑定到ReloadSave对吗?

因此需要为ReloadCommandProperty创建,声明和定义类型为SaveCommandProperty的两个依赖项属性ICommandSomeCustomControl

假设SomeCustomControl来自Control ...

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}" /> 

答案 1 :(得分:2)

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

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

将代码中的绑定更改为

<Button Command={Binding ReloadCommand}" />

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