Использование событий ICommand с пользовательской кнопкой в ​​ControlTemplate - PullRequest
0 голосов
/ 16 января 2012

У меня есть шаблон элемента управления для ComboBox, который имеет кнопку в сегменте всплывающих окон ComboBox.

Как мне реагировать на нажатие кнопки «Другое» с помощью интерфейса ICommand?

            <Popup x:Name="PART_Popup"
  IsOpen="{TemplateBinding IsDropDownOpen}">
                <Border x:Name="PopupBorder" 
    HorizontalAlignment="Stretch" Height="Auto" 
    MinWidth="{TemplateBinding ActualWidth}"
    MaxHeight="{TemplateBinding MaxDropDownHeight}"
    BorderThickness="{TemplateBinding BorderThickness}" 
    BorderBrush="Black" Background="White" CornerRadius="3">
                    <ScrollViewer x:Name="ScrollViewer" BorderThickness="0" Padding="1">
                        <StackPanel>
                        <ItemsPresenter/>
                        <Button>Other</Button>
                        </StackPanel>
                    </ScrollViewer>

                </Border>

            </Popup>

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Хотя ответ HB будет работать, более ненавязчивый способ сделать это - через новое присоединенное свойство .

Давайте назовем его MoreCommand.

Вы связываете кнопкук MoreCommand в шаблоне элемента управления и привяжите MoreCommand к команде на ViewModel в точке, где вы объявляете экземпляры ComboBox.

Details.

1.) Вы создаете статический класс, который предоставляет прикрепленныйсвойство

public static class AttachedCommand
{
    public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(AttachedCommand));

    public static bool GetCommand(DependencyObject dependencyObject)
    {
        return (bool)dependencyObject.GetValue(CommandProperty);
    }

    public static void SetCommand(DependencyObject dependencyObject, bool value)
    {
        dependencyObject.SetValue(CommandProperty, value);
    }
}

2.) Вы добавили поддержку в свой шаблон элемента управления для этого присоединенного свойства

            <Popup x:Name="PART_Popup"
  IsOpen="{TemplateBinding IsDropDownOpen}">
                <Border x:Name="PopupBorder" 
    HorizontalAlignment="Stretch" Height="Auto" 
    MinWidth="{TemplateBinding ActualWidth}"
    MaxHeight="{TemplateBinding MaxDropDownHeight}"
    BorderThickness="{TemplateBinding BorderThickness}" 
    BorderBrush="Black" Background="White" CornerRadius="3">
                    <ScrollViewer x:Name="ScrollViewer" BorderThickness="0" Padding="1">
                        <StackPanel>
                        <ItemsPresenter/>
                        <Button Command={TemplateBinding local:AttachedCommand.Command}>Other</Button>
                        </StackPanel>
                    </ScrollViewer>
                </Border>
            </Popup>

Убедитесь, что вы определили «локальное» пространство имен.

3.) По вашему мнению, вы привязываете присоединенное свойство к представлению модели

<ComboBox ItemsSource={Binding Items} local:AttachedCommand.Command={Binding FetchMoreItems} />

Преимущество заключается в том, что вам не нужно создавать подкласс Combobox, и вы можете потенциально комбинировать несколько «настроек» одного и того жеконтроль в будущем, без риска взрыва класса.

0 голосов
/ 16 января 2012

В ComboBox нет «комнаты» для этого, вы можете наследовать от ComboBox и ввести свойство ICommand, которое затем можно связать с Button.Command.

...