我正在使用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中删除绑定后也是如此)。
我错过了什么?提前谢谢。
答案 0 :(得分:0)
您的初始代码段应该可以在不设置contentpresenter的情况下工作,因为'ItemTemplate'不需要内容呈现器来呈现。我建议检查ViewModel和'MyObjects'中的对象是否正在实现IPropertyNotifyChanged。同时检查“输出”窗口以查看是否报告了任何绑定问题。
如果没有看到有关如何设置viewmodel的代码,以及其中的代码,我无法进一步帮助。
此外,虽然不在您的问题中,但您似乎在ViewModel中设置了View特定属性。不是一个好主意 - 视图模型应该是不可知的,以查看相关的问题。使用MVVM并不意味着在任何地方使用绑定,并且应该在控件的xaml或引用样式中显式设置诸如设置UI控件布局之类的东西。