我如何从模板 child 中创建一个要从 parent 访问的 DependencyProperty?

How i make a DependencyProperty from a template child to be accessed from the parent?

风格是这样的:

<Style TargetType="{x:Type c:Setup}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type c:Setup}">
                <CheckBox x:Name="PART_CheckBox"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我想为名为 'IsChecked' 的安装程序制作一个 属性,但要检查 CheckBox 控件是否已选中。只有 Get,没有 Set。

public class Setup : UserControl
{
    public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(Setup), new PropertyMetadata(false));

    private CheckBox _CheckBox = null;

    // -[ Constructor:

    public Setup() : base()
    {

    }

    static Setup()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(Setup), new FrameworkPropertyMetadata(typeof(Setup)));
    }

    // -[ Template:

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        _CheckBox = (CheckBox) Template.FindName("PART_CheckBox", this);
        _CheckBox.Unchecked += _CheckBox_Unchecked;
        _CheckBox.Checked += _CheckBox_Unchecked;
        _CheckBox.Indeterminate += _CheckBox_Unchecked;
    }

    private void _CheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        IsChecked = _CheckBox.IsChecked == true;
    }

    // -[ Property:

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

是否有其他替代方法来捕获 child IsChecked 到 parent?

模板绑定只能单向显示存储的值,但不允许您设置它们 如果你想设置它们,你需要一个双向的正常绑定,但你必须告诉它连接到模板化的父级:

<Style TargetType="{x:Type c:Setup}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type c:Setup}">
                <CheckBox IsChecked="{Binding Path=IsChecked , RelativeSource={RelativeSource TemplatedParent}}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>