1

私がそれを書いたとき、これは正しくなかったことを知っており、別の回答のほとんどの回答を収集することができましたが、最後のビットを把握できません。バインディングは、UI から 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>

Content Binding は、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 に設定された値を UI に表示することはできません。

...確かにここで少し助けが必要です、ありがとう。

4

1 に答える 1

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 の登録名に注目してください。

于 2013-01-10T19:27:51.613 に答える