1

我是一名长期的 WPF 设计师,但对 Windows 应用程序开发还很陌生。我正在尝试将一组对象绑定到网格上,但不断收到错误Unknown attachable member '(Grid.Row)' on element 'FrameworkElement'Unknown attachable member '(Grid.Column)' on element 'FrameworkElement'.

有人可以向我解释如何通过样式设置各种网格附加属性吗?

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <!-- Column and row definitions omitted for brevity -->
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="FrameworkElement">
            <Setter Property="(Grid.Row)" Value="{Binding Row}" />
            <Setter Property="(Grid.Column)" Value="{Binding Column}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
4

2 回答 2

2

不要使用 PropertyPath。您只需要一个合格的 Owner.Property 字符串。

<Setter Property="Grid.Row" Value="{Binding Row}" />

取自PropertyPath XAML 语法

某些样式和模板属性(例如 Setter.Property)采用表面上类似于 PropertyPath 的限定属性名称。但这不是真正的 PropertyPath;相反,它是 WPF XAML 处理器结合 DependencyProperty 的类型转换器启用的限定 owner.property 字符串格式用法。

于 2013-02-24T16:49:12.110 回答
1

事实证明,我上面发布的代码实际上存在 3 个问题。

正如 @LPL 正确识别的那样Setter.Value,在使用 PropertyPath 的地方采用了限定的属性名称。这里的解决方法是去掉括号:<Setter Property="Grid.Row" ... /><Setter Property="Grid.Column" ... />.

第二个问题是样式目标类型。事实证明,metro Grid 附加属性不能应用于 FrameworkElement。这里的解决方案是用更具体的东西更新目标类型<Style TargetType="ContentPresenter" />

最后,与 Silverlight 一样,metro setter 的 value 属性不支持 bindings。因此,即使在修复了前两个错误之后,setter 实际上仍试图将网格附加属性设置为 Binding 类型的实例。虽然不是那么直接,但可以在此处找到解决方案的所有细节。总之,您可以使用 setter设置自定义附加属性,这将反过来设置任何所需的绑定

于 2013-02-25T16:09:22.687 回答