web-dev-qa-db-ja.com

WPFスタイルでバインドすると、説明できない「管理するFrameworkElementが見つかりません」エラーが発生します

長方形の束を表示するItemsControlがあります。各長方形は、上方向および左方向にオフセットする必要があります。そこで、バインディングを使用して長方形の幅、高さ、X平行移動、およびY平行移動を設定するRectangleStyleを作成しました。

幅と高さのバインディングは正常に機能していますが、TranslateTransformバインディングで次のエラーが発生します。

System.Windows.Dataエラー:2:ターゲット要素の管理FrameworkElementまたはFrameworkContentElementが見つかりません。 BindingExpression:Path = Offset.X; DataItem = null;ターゲット要素は「TranslateTransform」(HashCode = 16452547)です。ターゲットプロパティは「X」(タイプ「Double」)です

これが私のItemControlの定義です。

<ItemsControl
    Style="{StaticResource ItemsControlStyle}"
    ItemsSource="{Binding Zones}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle Style="{StaticResource RectangleStyle}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ItemsControlStyleの定義は次のとおりです。

<Style x:Key="ItemsControlStyle" TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style>
                <Setter Property="Canvas.Left" Value="{Binding Point.X}" />
                <Setter Property="Canvas.Top" Value="{Binding Point.Y}" />
            </Style>
        </Setter.Value>
    </Setter>
</Style>

そして、これがRectangleStyleの定義です。

<Style x:Key="RectangleStyle" TargetType="Rectangle">
    <Setter Property="Width" Value="{Binding Size.Width}" />
    <Setter Property="Height" Value="{Binding Size.Height}" />
    <Setter Property="RenderTransform">
        <Setter.Value>
            <!-- these bindings are causing the error -->
            <TranslateTransform X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
        </Setter.Value>
    </Setter>
</Style>

RenderTransformRectangleStyleセッターにある2つのバインディングがエラーの原因ですが、問題を解決するために何をすべきかわかりません。興味深いことに、グラフィックは適切に変換されているため、WPFはバインディングを解決できます。何らかの理由でそれらに満足していません。

バインディングを修正するにはどうすればよいですか?


編集

MSConnectに関するバグレポートを提出しました。

https://connect.Microsoft.com/VisualStudio/feedback/details/746840/misleading-cannot-find-governing-frameworkelement-error-message-appears-in-output-window

23
devuxer

エラーメッセージが発生する理由も説明できませんが、x:Nameプロパティをトランスフォームに追加すると、エラーメッセージを取り除く方法であることがわかりました。

<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" /> 
51
user128300

私はいくつかの有用な情報を見つけたと思います。

http://social.msdn.Microsoft.com/Forums/en-US/wpf/thread/db050ce6-d084-41ad-9a31-c0183168768

これに対する答えは、ItemsControlが合成プロセスを実行し、バインディングとスタイルを適用するときの動作に関するMicrosoftの説明にあるようです。つまり、WPFは、バインディングを正常に評価するためのデータのソースを取得する前に、DataTemplateを最適化しようとしています: "dataitem = null"。レイアウトパス中の他のすべてのインスタンスでは、「dataitem」は「Zones」IEnumerable内の何かを指し、バインディングを完了することができます。そうしないと、プロパティごとに1回だけではなく、コレクション内の各アイテムでエラーが発生します。

それは「カーテンの後ろの男に注意を払わない」タイプのもののようです。そして、おそらくバグレポートとしてMSConnectに追加する必要があります。成功したコードは、問題ではない「エラー」を追い出すべきではありません。ただし、必要に応じて、これをMSConnectに提出するのはあなたに任せます。

10
Rob Perkins

Rob Perkinsの回答を読んだ後、この問題のバインディングにFallbackValueを追加しました。これでエラーが解消されました。

2
AdamRossWalker