WPF使下拉变为可见时展开

时间:2016-04-30 12:21:50

标签: c# wpf xaml

我有一个自定义下拉列表和两个或多个单选按钮:当第一个单选按钮被勾选时,下拉列表被隐藏,当勾选任何其他下拉列表时,下拉列表可见,并允许用户选择项目(例如,无线电所有项目,所选项目,选定的主要项目。)

当用户点击第二个或第三个无线电时,我需要默认展开下拉列表(因此下拉列表变为可见并立即展开)。

我有一种工作方法,但似乎并不符合WPF的良好做法:

XAML:

<layout:MultiSelectCaseTypeComboBoxEdit
            IsVisibleChanged="CaseTypesComboBox_OnIsVisibleChanged"
            EditValue="{Binding Path=SelectedCaseTypes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
....
/>

* xaml.cs:

    private void CaseTypesComboBox_OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var cb = sender as MultiSelectCaseTypeComboBoxEdit;
        cb.IsPopupOpen = cb.IsVisible;
    }

如您所见,在事件IsVisibleChanged上,我将下拉列表的IsPopupOpen值等于它的可见性。

但我的问题是,如何在* .xaml.cs文件中使用触发器/行为而没有任何其他代码的WPF方法?

更新1: 以下是基本控件样式的代码:

<Style TargetType="{x:Type layoutControls:EditableMultiSelectComboBoxEdit}" 
       x:Key="{x:Type layoutControls:EditableMultiSelectComboBoxEdit}"
       BasedOn="{StaticResource {x:Type editors:ComboBoxEdit}}">
    <Style.Triggers>
        <Trigger Property="SelectedItemDeleted" Value="True">
            <Setter Property="ToolTip" Value="The selected item(s) was delete. Click to refresh"/>
            <Setter Property="BorderTemplate">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ContentControl}">
                        <Border BorderThickness="1" BorderBrush="Red">
                            <ContentPresenter/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

如您所见,它在此处使用了一些删除逻辑,并基于DevExpress ComboBoxEdit控件。

更新2: 我通过这种方式添加了风格:

<layout:MultiSelectCaseTypeComboBoxEdit.Resources>
                <Style x:Key="EditableMultiSelectComboBoxEdit1" 
TargetType="layout:MultiSelectCaseTypeComboBoxEdit" />
            </layout:MultiSelectCaseTypeComboBoxEdit.Resources>
            <layout:MultiSelectCaseTypeComboBoxEdit.Style>
                <Style TargetType="layout:MultiSelectCaseTypeComboBoxEdit"
                     BasedOn="{StaticResource EditableMultiSelectComboBoxEdit1}">

还试过这个:

<layout:MultiSelectCaseTypeComboBoxEdit.Resources>
                <Style x:Key="EditableMultiSelectComboBoxEdit1" 
TargetType="{x:Type layout:MultiSelectCaseTypeComboBoxEdit}" />
            </layout:MultiSelectCaseTypeComboBoxEdit.Resources>
            <layout:MultiSelectCaseTypeComboBoxEdit.Style>
                <Style      TargetType="layout:MultiSelectCaseTypeComboBoxEdit"
                     BasedOn="{StaticResource EditableMultiSelectComboBoxEdit1}">

仍然得到同样的错误。

在基本控制的风格中,它的键被定义为

x:Key="{x:Type layoutControls:EditableMultiSelectComboBoxEdit}"

那我该如何正确地继承呢?

2 个答案:

答案 0 :(得分:0)

你走了。您可以使用DataTrigger完成此操作,然后相应地设置IsPopupOpen属性。

<layout:MultiSelectCaseTypeComboBoxEdit
            EditValue="{Binding Path=SelectedCaseTypes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <layout:MultiSelectCaseTypeComboBoxEdit.Style>
        <Style TargetType="layout:MultiSelectCaseTypeComboBoxEdit">
            <Setter Property="IsPopupOpen" Value="False" />
            <Style.Triggers>
                 <DataTrigger Binding="{Binding IsVisible, RelativeSource={RelativeSource Self}}" Value="True">
                    <Setter Property="IsPopupOpen" Value="True" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </layout:MultiSelectCaseTypeComboBoxEdit.Style>            
</layout:MultiSelectCaseTypeComboBoxEdit>

编辑:

您还可以使用BasedOn保留基本样式。

<Style TargetType="layout:MultiSelectCaseTypeComboBoxEdit" BasedOn="{StaticResource MyBaseStyle}">

其中MyBaseStyle是用于基本控件的样式的资源。

EDIT2:

如果您无法从基本样式创建密钥,请尝试:

<Style TargetType="layout:MultiSelectCaseTypeComboBoxEdit" BasedOn="{StaticResource {x:Type editors:ComboBoxEdit}}">

答案 1 :(得分:0)

最终为我工作的解决方案包括使用WPF行为:

XAML:

    <layout:MultiSelectCaseTypeComboBoxEdit>
        <i:Interaction.Behaviors>
            <behaviors:ComboboxExpandingBehavior/>
        </i:Interaction.Behaviors>
    </layout:MultiSelectCaseTypeComboBoxEdit>

行为代码:

public class ComboboxExpandingBehavior : Behavior<EditableMultiSelectComboBoxEdit>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.IsVisibleChanged += OnVisibleChanged;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.IsVisibleChanged -= OnVisibleChanged;
        base.OnDetaching();
    }

    private void OnVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var cb = sender as EditableMultiSelectComboBoxEdit;

        if (cb != null)
        {
            cb.IsPopupOpen = cb.IsVisible;
        }
    }
}