wpf - 如何处理附加属性事件?

标签 wpf events mvvm attached-properties

我创建了一个扩展器样式,在其标题中包含一个复选框。复选框状态绑定(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/

相关文章:

wpf - 与 WPF 连接的身份服务器

mysql - 找不到这个 MySQL 事件语法有什么问题

c# - 为什么这个 MultiDataTrigger 会在动画上抛出异常?

c# - Xamarin Forms PCL with Caliburn,只有创建 View 层次结构的原始线程才能触及其 View

具有许多用户控件的 WPF 应用程序

c# - WPF:使用 MVVM 时更改数据绑定(bind)

c# - 在所有桌面上的任何窗口上的 WPF 中捕获 'text entering'

c# - EventTrigger 绑定(bind)到来自 DataContext 的事件

c# - 没有调用的C#事件

events - 在 GWT 2.0 中切换 StackLayoutPanel 堆栈时触发事件