Windows runtime 绑定到C+中的Windows::UI::Xaml::GridLength+/CX

Windows runtime 绑定到C+中的Windows::UI::Xaml::GridLength+/CX,windows-runtime,windows-store-apps,c++-cx,Windows Runtime,Windows Store Apps,C++ Cx,我正在尝试绑定到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'; BindingExpressio

我正在尝试绑定到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').
我的XAML文件基本上如下所示:

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; }
        }
    }
}
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding MyHeight}"/>
    </Grid.RowDefinitions>
</Grid>


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

因此,属性类型投影似乎没有按照您或我的预期工作。它将
GridLength
属性包装在
i引用中(或者,在C#中,
Nullable
)。尝试绑定到
MyHeight.Value

行定义不是框架元素,因此它没有DataContext。装订在这里不起作用。但是,您可以在该行中放置一个矩形,将行高度设置为“自动”,并将矩形.height绑定到所需的属性。这可能适用于某些场景。对于其他人来说,可能有更好的解决方案,但您需要指定您正试图实现的内容。

HM。有趣的是,我现在得到了这个修改的错误:<代码>错误:绑定表达式路径错误:“WINDOWS”属性没有在“Windows .Frase.IcRead”1’上找到。< /代码>啊!我发现了一些有趣的东西。基于C++和C<<代码>结构> /CODECs需要互操作的辅助类。查看
GridLengthHelper
类。如果有效,我将编辑答案以反映它。很有趣,但我不确定这是问题所在。Petzold提到绑定到非属性的值时存在问题,如果我试图绑定到GridLength结构的成员,这将是一个问题。但是,由于
MyHeight
是一个属性,我认为这不适用。即使是这样,我也会在“找不到属性”的某个地方遇到错误,而不是转换错误。此外,我可以正确地绑定到其他值结构(例如
fontwweight
),这非常令人失望。您的矩形想法似乎太乏味了,因为我需要在n行之间分割n
TextBlock
s的空间,只有一些是不可见的,因此一些是换行的。根据您的建议,我必须积极倾听总高度(它已经打破了MVVM模式)和分割等。这是WPF的答案,正如评论正确建议的那样——在视图模型中放置GridLength是错误的。在您的案例中,
StackPanel
或a可能是更好的布局控件,或者其他一些面板、自定义控件或附加属性来控制布局。请记住,使用MVVM并不意味着不能使用带有代码隐藏、依赖属性等的自定义控件。啊,我明白了。谢谢我不打算在视图模型中保留
GridLength
。相反,我(最终)打算将其设置为整数,然后在绑定上提供一个转换器。但是,这个想法似乎没有希望。获取所需内容的简单方法可能是向网格添加一个附加属性,该属性绑定到int并自动更新网格的行定义。事实上,我以前在博客上写过WPF的一个这样的解决方案,它对WinRT也应该同样有效。谢谢你的建议。我最终听到了
DataContext
的变化,然后设置了一个可视状态(这对我来说是一个极好的解决方案)。从那时起,正确设置所需的属性就变得微不足道了(顺便说一句,我最终改变了
RowSpan
,而不是
RowDefinition
s,因为这或多或少是我最终想要的行为