在ControlTemplate中使用ICommand事件和自定义按钮

时间:2012-01-16 09:43:55

标签: wpf wpf-controls

我有一个ComboBox的控件模板,它在ComboBox的Popup段上有一个按钮。

我如何对"其他"做出反应?按钮单击使用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 个答案:

答案 0 :(得分:2)

虽然H.B.的回答是有效的,但更为不引人注目的方法是通过一个新的attached property

我们称之为MoreCommand。

将Button绑定到控件模板中的MoreCommand,并在声明ComboBox实例时将MoreCommand绑定到ViewModel上的命令。

详情。

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,并且您可能在将来组合同一控件的多个“自定义”,而不会有类爆炸的风险。

答案 1 :(得分:0)

ComboBoxes没有任何“空间”,您可以从ComboBox继承并引入ICommand属性,然后可以将Button.Command绑定到。