Как создать привязываемые команды в пользовательском элементе управления? - PullRequest
19 голосов
/ 05 октября 2011

Предполагая код, подобный приведенному ниже,

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.

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

РЕДАКТИРОВАТЬ 1) Я могу использовать DataContext SomeView в SomeCustomControl.Существует больше логики и разделения между двумя, которые я не могу растворить.Я "должен" сохранить ссылку на Обновить / Сохранить ICommands где-нибудь в моем SomeCustomControl.

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

Ответы [ 2 ]

37 голосов
/ 05 октября 2011

Позвольте мне объяснить, что вы хотите связать с 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 голосов
/ 05 октября 2011

Создайте свойство, которое будет возвращать вашу команду, и свяжите это свойство, где это необходимо.

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

Измените привязку в вашем коде на

<Button Command={Binding ReloadCommand}" />

И привяжите пользовательский элемент управления DataContext к модели представления, содержащей команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...