Как сделать DependencyProperty из дочернего шаблона для доступа от родителя? - PullRequest
1 голос
/ 15 марта 2019

Стиль такой:

<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); }
    }
}

Является ли другая альтернатива для захвата дочернего элемента IsChecked to parent?

1 Ответ

0 голосов
/ 15 марта 2019

Привязка шаблона работает только в одностороннем порядке для отображения сохраненных значений, но не позволяет вам их устанавливать. Если вы хотите установить их, вам нужна обычная привязка, которая является двухсторонней, но вы должны указать ее для подключения к шаблонному родителю:

<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>
...