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

时间:2016-05-06 21:54:35

标签: 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:Bind)

此:

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

这一点:

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

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

  

错误CS1503参数1:无法转换   &#39; Windows.UI.Xaml.Controls.Flyout&#39;至   &#39; Windows.UI.Xaml.FrameworkElement&#39;

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

1 个答案:

答案 0 :(得分:5)

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

我们知道{x:Bind}使用生成的代码来实现其好处。这些代码可以在 obj 文件夹中找到,其名称类似于(对于C#) &lt; view name&gt; .g.cs 即可。有关详细信息,请参阅{x:Bind} markup exstrong texttension

如果您转到 .g.cs 文件(我在FlyoutHelper中使用MainPage,那么在我这边,它是 MainPage.g.cs ),您会发现错误在 Set_FlyoutDemoSample_FlyoutHelper_Parent 方法中。此方法在编译时生成,FlyoutDemoSample是项目的命名空间。它的名字可能与您不同。 enter image description here

如果我们转到这个方法的定义,我们会发现这个方法中第一个参数的类型是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时,我们在此处设置的参数为Flyoutenter image description here Flyout类不是来自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);
}

但是,这些代码是自动生成的,如果我们重建这个项目,我们仍然会得到同样的错误。我不确定这是否是UWP中的潜在错误,但我认为我们无法解决它。因此,我建议您在此特殊情况下仍然使用Binding