为ItemsControl的项设置Canvas.Left

时间:2012-11-24 17:47:30

标签: xaml datatemplate winrt-xaml

我正在使用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中删除绑定后也是如此)。

我错过了什么?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的初始代码段应该可以在不设置contentpresenter的情况下工作,因为'ItemTemplate'不需要内容呈现器来呈现。我建议检查ViewModel和'MyObjects'中的对象是否正在实现IPropertyNotifyChanged。同时检查“输出”窗口以查看是否报告了任何绑定问题。

如果没有看到有关如何设置viewmodel的代码,以及其中的代码,我无法进一步帮助。

此外,虽然不在您的问题中,但您似乎在ViewModel中设置了View特定属性。不是一个好主意 - 视图模型应该是不可知的,以查看相关的问题。使用MVVM并不意味着在任何地方使用绑定,并且应该在控件的xaml或引用样式中显式设置诸如设置UI控件布局之类的东西。