2

我根据这篇文章制作了“MVVM flyout”:https ://marcominerva.wordpress.com/2015/01/15/how-to-open-and-close-flyouts-in-universal-apps-using-mvvm/

它运作良好。但它不适用于已编译的绑定(x:Bind)

这个:

 <Flyout local:FlyoutHelpers.Parent="{x:Bind ShowButton}"...

除此之外:

<Flyout local:FlyoutHelpers.Parent="{Binding ElementName=ShowButton}"...

构建时抛出奇怪的错误:

错误 CS1503 参数 1:无法从“Windows.UI.Xaml.Controls.Flyout”转换为“Windows.UI.Xaml.FrameworkElement”

有什么选择如何使用 x:Bind 吗?

4

1 回答 1

5

这里的问题与生成的代码有关{x:Bind}。 

正如我们所知{x:Bind},使用生成的代码来实现它的好处。这些代码可以在obj文件夹中找到,名称类似于 (for C#) <view name>.g.cs。有关详细信息,请参阅{x:Bind} 标记 exstrong texttension

如果你去.g.cs文件(我用过FlyoutHelperMainPage所以在我这边,它是MainPage.g.cs),你会发现错误在Set_FlyoutDemoSample_FlyoutHelper_Parent方法中。这个方法是在编译时生成的,FlyoutDemoSample是我项目的命名空间。它的名字在你身边可能会有所不同。   在此处输入图像描述

如果我们去这个方法的定义,我们会发现这个方法中第一个参数的类型是FrameworkElement

public static void Set_FlyoutDemoSample_FlyoutHelper_Parent(global::Windows.UI.Xaml.FrameworkElement obj, global::Windows.UI.Xaml.FrameworkElement value, string targetNullValue)
{
    if (value == null && targetNullValue != null)
    {
        value = (global::Windows.UI.Xaml.FrameworkElement) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.FrameworkElement), targetNullValue);
    }
    global::FlyoutDemoSample.FlyoutHelper.SetParent(obj, value);
}

但是在使用的时候FlyoutHelper,我们这里设置的参数是a Flyout。   类不是派生自. 所以它会抛出一个错误:. 如果我们将第一个参数的类型更改为,则所有代码都可以正常工作。在此处输入图像描述 FlyoutFrameworkElementcannot convert from 'Windows.UI.Xaml.Controls.Flyout' to 'Windows.UI.Xaml.FrameworkElement'DependencyObject

public static void Set_FlyoutDemoSample_FlyoutHelper_Parent(global::Windows.UI.Xaml.DependencyObject obj, global::Windows.UI.Xaml.FrameworkElement value, string targetNullValue)
{
    if (value == null && targetNullValue != null)
    {
        value = (global::Windows.UI.Xaml.FrameworkElement) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::Windows.UI.Xaml.FrameworkElement), targetNullValue);
    }
    global::FlyoutDemoSample.FlyoutHelper.SetParent(obj, value);
}

但是,这些代码是自动生成的,如果我们重新构建这个项目,我们仍然会得到同样的错误。我不确定这是否是 UWP 中的一个潜在错误,但我认为我们无法修复它。所以我建议你仍然Binding在这种特殊情况下使用。

于 2016-05-20T12:06:49.723 回答