使用x:与附加属性绑定(显示弹出)

Ala*_*bra 2 c# mvvm win-universal-app compiled-bindings

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

它运作良好.但它不适用于编译绑定(x:绑定)

这个:

 <Flyout local:FlyoutHelpers.Parent="{x:Bind ShowButton}"...
Run Code Online (Sandbox Code Playgroud)

这个问题:

<Flyout local:FlyoutHelpers.Parent="{Binding ElementName=ShowButton}"...
Run Code Online (Sandbox Code Playgroud)

在构建时抛出奇怪的错误:

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

有没有选项如何使用x:Bind?

小智 5

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

我们知道{x:Bind}使用生成的代码来实现其好处.这些代码可以在obj文件夹中找到,其名称类似于(对于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);
}
Run Code Online (Sandbox Code Playgroud)

但是在使用时FlyoutHelper,我们在这里设置的参数是a Flyout.   在此输入图像描述 Flyoutclass不是源于FrameworkElement.所以它抛出一个错误:cannot 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);
}
Run Code Online (Sandbox Code Playgroud)

但是,这些代码是自动生成的,如果我们重建这个项目,我们仍然会得到相同的错误.我不确定这是否是UWP中的潜在错误,但我认为我们无法解决它.所以我建议你仍然Binding在这个特殊场景中使用.