1

データテンプレートの添付プロパティに興味深いことが起こることは理解していますが、これは非常に奇妙です。

依存関係プロパティを持つ動作があり、プロパティはタイプですList<DataStatePair>

[System.Windows.Markup.ContentProperty("StateDefinitions")]
public class MultiDataStateBehavior: StateBehaviourBase
{
    public List<DataStatePair> StateDefinitions
    {
        get { return (List<DataStatePair>)GetValue(StateDefinitionsProperty); }
        set { SetValue(StateDefinitionsProperty, value); }
    }

    // Using a DependencyProperty as the backing store for StateDefinitions.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty StateDefinitionsProperty =
        DependencyProperty.Register("StateDefinitions", typeof(List<DataStatePair>), typeof(MultiDataStateBehavior), new PropertyMetadata(new List<DataStatePair>()));
}

ご覧のとおり、コンテンツ プロパティとしてマークしました。XAML は次のようになります。

<DataTemplate>
<!-- VISUAL STATES  OMITTED FOR BREVITY-->
<Grid x:Name="grid" Background="Transparent" ContextMenu="{StaticResource ContextMenu_ToolMenu}">
                    <i:Interaction.Behaviors>
                        <ext:MultiDataStateBehavior Binding="{Binding Type}">
                                <ext:DataStatePair State="None" Value="{x:Null}"/>
                                <ext:DataStatePair State="Gauge" Value="{x:Static jcm:ToolType.Gauge}"/>
                                <ext:DataStatePair State="Repeater" Value="{x:Static jcm:ToolType.Gauge}"/>
                        </ext:MultiDataStateBehavior>
                    </i:Interaction.Behaviors>
</Grid>
</DataTemplate>

問題?データテンプレートを使用するたびに、3 つの DataStatePair インスタンスが追加されます。アプリでテンプレートを 32 回使用し、合計 96 個の DataStatePair インスタンスを取得しました。グリズリー!これがどのように可能かを理解しています。Behavior は datatemplate に対して静的ですが、DataStatePair インスタンスはそうではなく、List を追加できます。

依存関係プロパティを IEnumerable に変更すると、すべてが壊れます - コンパイルされません。XAML で x:Array を使用してプロパティを明示的に設定すると、すべてが期待どおりに機能し、3 つの状態しか得られません。以下の XAML。

<i:Interaction.Behaviors>
                        <ext:MultiDataStateBehavior Binding="{Binding Type}" UseTransitionsOnLoad="True">
                            <ext:MultiDataStateBehavior.StateDefinitions>
                                <x:Array Type="{x:Type ext:DataStatePair}">
                                    <ext:DataStatePair State="None" Value="{x:Null}"/>
                                    <ext:DataStatePair State="Gauge" Value="{x:Static jcm:ToolType.Gauge}"/>
                                    <ext:DataStatePair State="Repeater" Value="{x:Static jcm:ToolType.Gauge}"/>
                                </x:Array>
                            </ext:MultiDataStateBehavior.StateDefinitions>
                        </ext:MultiDataStateBehavior>
</i:Interaction.Behaviors>

これがなぜなのか、そして最もエレガントなソリューションが何であるかを知っている人はいますか? Microsoft の実装では、x:Array を使用する必要はないと想像できます。

編集: x:Array ソリューションは、ブレンド デザイナーを壊します。

XamlParseException: 型 'System.Collections.Generic.IEnumerable(SSW.WPFExtensions.DataStatePair)' のコレクションに値を追加すると、例外がスローされました。

編集:[System.Windows.Markup.ContentProperty("StateDefinitions")]属性定義を削除するとうまくいきます。何が起こっているのかわかりません!

WPF、何をしている。WPF、STAHP

4

1 に答える 1