長方形の束を表示する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>
RenderTransform
のRectangleStyle
セッターにある2つのバインディングがエラーの原因ですが、問題を解決するために何をすべきかわかりません。興味深いことに、グラフィックは適切に変換されているため、WPFはバインディングを解決できます。何らかの理由でそれらに満足していません。
バインディングを修正するにはどうすればよいですか?
編集
MSConnectに関するバグレポートを提出しました。
エラーメッセージが発生する理由も説明できませんが、x:Nameプロパティをトランスフォームに追加すると、エラーメッセージを取り除く方法であることがわかりました。
<TranslateTransform x:Name="myTransform" X="{Binding Offset.X}" Y="{Binding Offset.Y}" />
私はいくつかの有用な情報を見つけたと思います。
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に提出するのはあなたに任せます。
Rob Perkinsの回答を読んだ後、この問題のバインディングにFallbackValueを追加しました。これでエラーが解消されました。