我有一个自定义下拉列表和两个或多个单选按钮:当第一个单选按钮被勾选时,下拉列表被隐藏,当勾选任何其他下拉列表时,下拉列表可见,并允许用户选择项目(例如,无线电所有项目,所选项目,选定的主要项目。)
当用户点击第二个或第三个无线电时,我需要默认展开下拉列表(因此下拉列表变为可见并立即展开)。
我有一种工作方法,但似乎并不符合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}"
那我该如何正确地继承呢?
答案 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;
}
}
}