私はWindows 8アプリに取り組んでいます。Canvas 内にいくつかのコントロール (画像、四角形) を配置する必要があります。直接行うと、子 (前述のコントロール) で「Canvas.Left」添付プロパティを使用している場合はすべて問題ありません。ただし、MVVM を使用したいと思います。したがって、次のように ItemsControl を使用するようになりました。
<ItemsControl ItemsSource="{Binding MyObjects}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Image}" Visibility="{Binding IsImage, Converter={StaticResource boolConverter}}" />
<Rectangle Canvas.Left="{Binding Left}" Canvas.Top="{Binding Top}" Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Fill}" Visibility="{Binding IsNoImage, Converter={StaticResource boolConverter}}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
バインディングは、添付された Canvas プロパティを除いて機能しています。いくつかの調査の結果、ItemsControl がその子を ContentPresenter でラップしているためであることがわかりました。したがって、私はstackoverflowで見つけた解決策を利用しようとしましたが、成功しませんでした:
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Left}" />
</Style>
</ItemsControl.ItemContainerStyle>
このコードを追加しても、Canvas.Left プロパティは設定されません (DataTemplate からバインディングを削除した後でも)。
私は何が欠けていますか?前もって感謝します。