2014-11-01 2 views
0

У меня есть обычай Button следующим образом:WPF команда связывания для пользовательского UserControl

<UserControl...> 
    <Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="3*"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 

      <Viewbox Stretch="Uniform" Grid.Column="0"> 
       <TextBlock x:Name="numCopyTB" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Text}"/> 
      </Viewbox> 
      <Viewbox Grid.Column="1"> 
       <TextBlock Style="{StaticResource updownBlock}"/> 
      </Viewbox> 

     </Grid> 
    </Button> 
</UserControl> 

в коде позади, я добавил его Text собственности. Код сзади ниже:

public partial class UpdownButton : UserControl 
{ 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(UpdownButton)); 

    public UpdownButton() 
    { 
     InitializeComponent(); 
    } 

    public string Text 
    { 
     get { return GetValue(TextProperty) as string; } 
     set { SetValue(TextProperty, value); } 
    } 
} 

Я учусь о CommandBinding и хотели бы быть в состоянии сделать что-то вроде <local:MyCustomButton Command="{Binding MethodName}"/>.

Похоже, что мне нужно добавить Command Недвижимость в код, но что Type должно Command быть? Я сделал несколько поисков, и, похоже, есть много возможностей: RoutedUICommand, RoutedCommand, CommandBinding, DelegateCommand и т. Д., И я совершенно потерян. Любая помощь приветствуется!

ответ

1

Любой объект, который вы связываете с Command DependencyProperty, должен реализовывать ICommand interface. Мое предложение, если все, что вы пытаетесь сделать, это использовать команду для захвата и обработки ввода клика на вашу кнопку, было бы использовать реализацию дизайна RelayCommand. Это позволит вам создать экземпляр RelayCommand в вашей ViewModel:

public RelayCommand yourCustomButtonCommand { get; set; } 

И в конструкторе, экземпляр RelayCommand так:

MyCommand = new RelayCommand( 
ExecuteMyCommand, 
() => _canExecuteMyCommand); 

где ExecuteMyCommand является метод, который вы хотите быть выполнены каждый раз, когда нажимается кнопка, а _canExecuteMyCommand - это предикат, определяющий, должна ли кнопка быть кликабельна или нет в любой момент времени.

Основываясь на ваш вопрос, вот как вы можете наследовать от кнопки в коде-за:

public partial class UpdownButton : Button 
{ 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(UpdownButton)); 

    public UpdownButton() 
    { 
     InitializeComponent(); 
    } 

    public string Text 
    { 
     get { return GetValue(TextProperty) as string; } 
     set { SetValue(TextProperty, value); } 
    } 
} 

Это произвело бы объект, который наследует все свойства зависимости от кнопки, и имеет новые определенные вами выше. Самое главное помнить, что тип верхнего уровня для вашего XAML в пользовательском элементе управления должен быть изменен на <Button>, а не <UserControl>.

С этими изменениями у вашего UpdownButton теперь будет свойство Command, а также все остальные свойства Button.

+1

благодарит за ответ. если бы я использовал 'RelayCommand', мне все равно нужно было бы сделать что-то вроде' 'для привязки команды к кнопке, правильно? Проблема в том, что в настоящее время 'MyCustomButton' не имеет свойства' Command' (не отображается в intellisense). поэтому необходимо ли использовать интерфейс «ICommand» для использования «RelayCommand»? – totoro

+0

@green Hm - вы наследуете от Button в своей пользовательской кнопке? Я понимаю, что в наследовании от элемента управления вы наследуете все свойства зависимостей. – furkle

+1

@green Hm, это, вероятно, невежество с моей стороны, но если вы пытаетесь сделать что-то, что работает почти как Button, но немного другое, почему бы просто не наследовать от Button? – furkle

 Смежные вопросы

  • Нет связанных вопросов^_^