当依赖属性更改时,不会引发WPF事件

时间:2016-06-06 18:11:26

标签: c# wpf xaml controls dependency-properties

我根据this链接上的“繁重选项”进行了以下自定义控制:

public partial class SelectableContentControl : ContentControl
{
    public SelectableContentControl()
    {
        InitializeComponent();
        var isCheckedDesc = DependencyPropertyDescriptor.FromProperty(IsCheckedProperty, typeof(SelectableContentControl));
        isCheckedDesc.AddValueChanged(this, IsCheckedPropertyChanged);
    }

    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }

    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.Register("IsChecked", typeof(bool),
          typeof(SelectableContentControl), new PropertyMetadata(false));

    private void IsCheckedPropertyChanged(object sender, EventArgs e)
    {
        var selectable = Content as IAmSelectable;
        if (selectable != null) selectable.IsSelected = IsChecked;
    }
}

SelectableContentControl定义的样式如下:

<Style TargetType="{x:Type controls1:SelectableContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls1:SelectableContentControl}">
                <CheckBox IsChecked="{TemplateBinding IsChecked}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

......和我的用法:

<controls:SelectableContentControl Grid.Row="2" Content="{Binding Dummy}" IsChecked="{Binding Dummy.IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

每当IsCheckedPropertyChanged值在UI上发生更改时,我都希望调用IsChecked,但这不会发生。有人看到我错过的东西吗?

1 个答案:

答案 0 :(得分:5)

TemplateBindingOneWay模式运行,这意味着该值仅在源到目标方向上更新(您的控件是源,而模板内的CheckBox是目标)。如果您希望绑定在TwoWay模式下工作,则应使用普通Binding代替:

<ControlTemplate TargetType="{x:Type controls1:SelectableContentControl}">
    <CheckBox IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}}" />
</ControlTemplate>

请注意,您不需要在绑定上指定Mode=TwoWay,因为默认情况下CheckBox.IsChecked属性以双向模式绑定。

有关详细信息,请参阅this question