我制作了" 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?
答案 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
是项目的命名空间。它的名字可能与您不同。
如果我们转到这个方法的定义,我们会发现这个方法中第一个参数的类型是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
时,我们在此处设置的参数为Flyout
。
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
。