Правильная привязка шаблона к DependencyProperty

Я знаю, что это было неправильно, когда я написал это, и я смог собрать большую часть ответа для другого ответа, но просто не могу понять последний момент. Привязка передается из пользовательского интерфейса в DependencyProperty (и другим способом при создании элемента управления).

Мой шаблон (необходимо переместить привязку IsChecked к экземпляру):

<ControlTemplate x:Key="MyHeaderedContentTemplate" TargetType="HeaderedContentControl">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="1*" />
    </Grid.RowDefinitions>
    <ContentControl>
        <StackPanel Orientation="Horizontal">
            <CheckBox Margin="2,2,20,2"
                                    Content="All/None"
                                    IsChecked="{Binding Path=AllFeatureTypesChecked, Mode=TwoWay}" />
            <TextBlock Text="{TemplateBinding Header}" Margin="2"/>
        </StackPanel>
    </ContentControl>
    <ContentControl Grid.Row="1" Content="{TemplateBinding Content}" />
</Grid>

Экземпляр:

<HeaderedContentControl Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Grid.ColumnSpan="2" Margin="4"
                    Template="{StaticResource  ResourceKey=MyHeaderedContentTemplate}"
                    Header="Feature Details by Type">
    <HeaderedContentControl.Resources>

    </HeaderedContentControl.Resources>
    <ListBox ItemTemplate="{StaticResource SelectableLinkNode}"
            ItemsSource="{Binding Features}"/>
</HeaderedContentControl>

Привязка содержимого предоставляет список элементов CheckBox

И Сеттер (конечно, есть логический AllFeatureTypesChecked DependencyProperty):

    /// <summary>
    /// Needs to be set on Startup and on ItemIsCheckedChanged Event from the Features List
    /// </summary>
    private void SetAllSelectedState()
    {
        bool allSelected = (Features.Count > 0);
        foreach (var CheckableItem in Features) {
            if (CheckableItem.IsChecked == false) {
                allSelected = false;
                break;
            }
        }

        SetCurrentValue(AllFeatureTypesCheckProperty, allSelected);

    }

Для справки, вот DP

public static readonly DependencyProperty AllFeatureTypesCheckProperty =
        DependencyProperty.Register("AllFeatureTypesCheck", typeof(Boolean), typeof(ReportSources),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnAllFeatureTypesCheckedChanged));

Это действительно забавная штука, и я не смог бы сделать это без удивительных людей здесь, на SO! Спасибо!

ОБНОВЛЕНИЕ: Хорошо, теперь у меня есть это (мозговой штурм):

    <ControlTemplate x:Key="MyHeaderedContentTemplate" TargetType="HeaderedContentControl">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="1*" />
            </Grid.RowDefinitions>
            <ContentControl>
                <StackPanel Orientation="Horizontal">
                <ContentPresenter Content="{DynamicResource ResourceKey=CheckControl}" Margin="2,2,20,2"/>
                    <TextBlock Text="{TemplateBinding Header}" Margin="2"/>
                </StackPanel>
            </ContentControl>
            <ContentControl Grid.Row="1" Content="{TemplateBinding Content}" />
        </Grid>
    </ControlTemplate>

инстанцируется так:

    <HeaderedContentControl Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Grid.ColumnSpan="2" Margin="4"
                            Template="{StaticResource  ResourceKey=MyHeaderedContentTemplate}"
                            Header="Feature Details by Type"
                            >
        <HeaderedContentControl.Resources>
            <CheckBox x:Key="CheckControl"
                      Content="All/None"
                      IsThreeState="True"
                      IsChecked="{Binding Path=AllFeatureTypesChecked, Mode=TwoWay}"
                      />
        </HeaderedContentControl.Resources>
        <ListBox ItemTemplate="{StaticResource SelectableLinkNode}"
                 ItemsSource="{Binding Features}"/>
    </HeaderedContentControl>

но по-прежнему не удается получить значение, установленное на DP, для отображения в пользовательском интерфейсе после создания элемента управления.

... конечно, можно использовать небольшую помощь здесь, спасибо.

1 ответ

Глупо, правда - или совсем глупо... Но я обвиняю использование строк для регистрации. IDE просто не делает достаточно, чтобы попытаться обновить такие вещи, когда изменяется написание идентификатора.

    public Boolean? AllFeatureTypesChecked
    {
        get { return (Boolean?) GetValue(AllFeatureTypesCheckedProperty); }
        set { SetValue(AllFeatureTypesCheckedProperty, value); }
    }

    #region Using a DependencyProperty as the backing store for AllFeatureTypesCheck.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AllFeatureTypesCheckedProperty =
        DependencyProperty.Register("AllFeatureTypesCheck", typeof(Boolean?), typeof(ReportSources),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnAllFeatureTypesCheckedChanged));
    #endregion

Обратите внимание на написание на объекте собственности против зарегистрированного имени на DP.

Другие вопросы по тегам