Как создать привязываемые команды в пользовательском элементе управления?

Предполагая код, как показано ниже,

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 мне нужно поддерживать "привязку ICommand в xaml". Я понимаю, что DependencyProperties может быть привязана так, но в этом случае мне нужно связать ICommand.

Может кто-нибудь, пожалуйста, предложите, что это лучший способ сделать это? Любой предлагаемый материал или ссылка будут полезны, потому что мне не хватает направления.

EDIT 1) Я могу использовать DataContext SomeView в SomeCustomControl. Существует логика и разделение между двумя, которые я не могу растворить. Я должен "поддерживать ссылку перезагрузки/сохранения ICommands где-то в моем SomeCustomControl.

Большое спасибо.

Ответы

Ответ 1

Позвольте мне сказать вам прямо, вы хотите привязать к Reload и Save правильно?

Таким образом, для создания, объявления и определения двух свойств зависимостей ReloadCommandProperty и SaveCommandProperty типа ICommand для SomeCustomControl.

Предположим, что 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);
        }
    }
}

После того, как начнется правильная привязка к свойствам RelodCommand и SaveCommand...

     <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 к модели представления, содержащей команды.