【问题标题】:Unknown attachable member 'Grid.Row'and 'Grid.Column'未知的可附加成员“Grid.Row”和“Grid.Column”
【发布时间】:2013-02-24 16:10:13
【问题描述】:

我是一名长期的 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>

【问题讨论】:

    标签: c# .net wpf microsoft-metro


    【解决方案1】:

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

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

    取自PropertyPath XAML Syntax

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

    【讨论】:

    • 这只能是另一个问题。所有人都使用它,所以没有错误(见herehere),对我来说它也可以。
    • System.Windows.Controls 命名空间中的 Grid 和 ItemsControl 之间还有更多这样的例子。我的问题是 Windows.UI.Xaml.Controls 命名空间内的 Windows 应用商店控件。
    • 抱歉,我不知道这在地铁控制中有所不同。
    • 原来括号是问题的一部分,而不是全部。地铁网格附加属性不喜欢在FrameworkElement 上设置。将样式的目标类型更新为 ContentPresenter 修复了此问题。现在要弄清楚为什么我的绑定没有被读取...
    【解决方案2】:

    原来我上面贴的代码其实有3个问题。

    @LPL 正确识别 Setter.Value 在使用 PropertyPath 的地方采用限定属性名称。此处的解决方法是去掉括号&lt;Setter Property="Grid.Row" ... /&gt;&lt;Setter Property="Grid.Column" ... /&gt;

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

    最后与 Silverlight 一样,value property of metro setters don't support bindings。因此,即使在修复了前两个错误之后,setter 实际上仍试图将网格附加属性设置为 Binding 类型的实例。虽然不是那么直截了当,但所有details of a solution may be found here。总之,您可以使用 setter 设置自定义附加属性,进而设置任何所需的绑定

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2011-02-13
      • 1970-01-01
      • 2011-09-20
      • 2011-10-27
      相关资源
      最近更新 更多