2

我正在开发一个 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 中删除绑定之后)。

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

4

1 回答 1

0

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

在没有看到有关如何设置视图模型的代码以及其中的代码的情况下,我无法提供进一步的帮助。

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

于 2012-11-25T09:56:18.827 回答