我有一个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>
答案 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
绑定到。