我正在开发一个 Windows 8 应用程序。我必须在画布内放置几个控件(图像、矩形)。如果我直接这样做,那么当我在子级(提到的控件)上使用“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 中删除绑定之后)。
我错过了什么?提前致谢。