【问题标题】:Binding to Windows::UI::Xaml::GridLength in C++/CX在 C++/CX 中绑定到 Windows::UI::Xaml::GridLength
【发布时间】:2013-07-03 19:33:54
【问题描述】:

我正在尝试在 C++/CX 中绑定到 Windows 应用商店应用程序(使用 Visual Studio 2013 编译器编译)中的 GridLength 实例,但由于某种原因,我在运行时不断收到以下错误:

Error: Converter failed to convert value of type 'Windows.Foundation.IReference`1<Windows.UI.Xaml.GridLength>' to type 'GridLength'; BindingExpression: Path='MyHeight' DataItem='MyNamespace.MyObject'; target element is 'Windows.UI.Xaml.Controls.RowDefinition' (Name='null'); target property is 'Height' (type 'GridLength').

我的代码基本上看起来像:

namespace MyNamespace
{
    [Windows::UI::Xaml::Data::Bindable]
    public ref class MyObject sealed
    {
        property Windows::UI::Xaml::GridLength MyHeight
        {
            Windows::UI::Xaml::GridLength get() { return myHeight; }
        }
    }
}

我的 XAML 文件基本上看起来像:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding MyHeight}"/>
    </Grid.RowDefinitions>
</Grid>

仅供参考,我班级中的其他属性已正确绑定。问题似乎仅与 GridLength 值结构有关。它显然是正确地找到了属性,但由于某种原因它无法匹配类型。

【问题讨论】:

    标签: windows-runtime windows-store-apps c++-cx


    【解决方案1】:

    RowDefinition 不是 FrameworkElement,因此它没有 DataContext。绑定在这里不起作用。不过,您可以在该行中放置一个 Rectangle,将行高设置为 Auto 并将 Rectangle.Height 绑定到您想要的属性。这可能适用于某些情况。对于其他人来说,可能有更好的解决方案,但您需要具体说明您想要实现的目标。

    【讨论】:

    • 这很令人失望。 There is even a post on SO suggesting that this should be possible。您的矩形想法似乎太乏味了,因为我需要在 n 行之间拆分 n TextBlocks 的空间,只有一些不可见,因此有些包装。根据您的建议,我将不得不积极倾听总高度(这已经打破了 MVVM 模式),并划分等等。
    • 这个答案是针对 WPF 的,正如评论正确地暗示的那样 - 将 GridLength 放在视图模型中是错误的。也许 StackPanelUniformGrid 在您的情况下或其他一些面板、自定义控件或附加属性将是更好的布局控件来控制布局。请记住,使用 MVVM 并不意味着您不能拥有带有代码隐藏、依赖属性等的自定义控件。
    • 啊,我明白了。谢谢。我不打算在我的视图模型中保留GridLength。相反,我(最终)将其设为整数,然后在绑定上提供转换器。看起来这个想法是没有希望的..
    • 获得所需内容的简单方法可能是简单地将附加属性添加到绑定到 int 的网格并自动更新网格的 RowDefinitions。事实上,我之前曾在博客上写过一个这样的 WPF 解决方案,它应该同样适用于 WinRT。检查this post
    • 感谢您的建议。我最终听了DataContext 的变化,然后设置了一个视觉状态(这对我来说是一个很好的解决方案)。从那里开始,正确设置我需要的属性是微不足道的(顺便说一句,我最终更改了RowSpan 而不是RowDefinitions,因为这或多或少是我最终想要的行为
    【解决方案2】:

    因此,属性类型投影似乎没有像您或我期望的那样工作。它将GridLength 属性包装在IReference&lt;T&gt; 中(或者,在C# 中,Nullable&lt;T&gt;)。尝试绑定到MyHeight.Value

    【讨论】:

    • 嗯。有趣的是,我现在通过该修改得到了这个错误:Error: BindingExpression path error: 'Value' property not found on 'Windows.Foundation.IReference`1&lt;Windows.UI.Xaml.GridLength&gt;'.
    • 啊!我发现了一些有趣的东西。基于this,c++ 和C# structs 需要一些帮助类来进行互操作。查看GridLengthHelperhere。如果可行,我将编辑答案以反映它。
    • 有趣,但我不确定这是这里的问题。 Petzold 提到绑定到不是属性的值存在问题,如果我试图绑定到 GridLength 结构的成员,这将是一个问题。但是,由于MyHeight 是一个属性,我认为这不适用。即使是这种情况,我也会在“找不到属性”的某处出现错误,而不是转换错误。此外,我可以正确绑定到其他值结构(例如FontWeight
    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2012-03-21
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多