我创建了一个扩展器样式,在其标题中包含一个复选框。复选框状态绑定(bind)到附加属性:
<Style TargetType="{x:Type Expander}" x:Key="MyCheckboxExpander">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Expander}">
(...)
<CheckBox x:Name="ExpanderHeaderChk" VerticalAlignment="Center" Margin="4,0,0,2"
IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(my:AP.IsChecked)}" />
(...)
我认为,在扩展器内部,我有一个带有 ComboBox 的堆栈面板。
每当用户检查扩展器的复选框时,我不希望组合框选择第一个项目,另一方面,每当用户取消选中它时,我不希望组合框的选定项为空。
我怎样才能做到这一点?我遵循 MVVM 模式,但由于这更多是一个观点问题,我愿意接受代码隐藏建议。
最佳答案
好吧,我认为您的设计不是最佳的。你看,你正试图改变 Expander
的语义。 .真正的扩展器没有附加复选框的语义,因此您创建的控件不再是扩展器。
我建议您切换到用户控件(或者可能是自定义控件,查看您的语义),并在控件的类中公开所需的事件。用户控件的 XAML 应该是带有复选框的扩展器。
编辑:带有 UserControl 的示例(未测试)
(XAML)
<UserControl x:Class="namespace:MyCheckboxExpander">
<Expander>
...
<Checkbox x:Name="cb"/>
...
</Expander>
</UserControl>
(代码隐藏)
public class MyCheckboxExpander : UserControl
{
MyCheckboxExpander()
{
InitializeComponent();
cb.Check += OnCheck;
}
void OnCheck(object sender, whatever2 args)
{
if (CheckboxTriggered != null)
CheckboxTriggered(new EventArgs<whatever>);
}
public event EventArgs<whatever> CheckboxTriggered;
}
关于wpf - 如何处理附加属性事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11539870/