我根据这篇文章制作了“MVVM 弹出窗口”:https://marcominerva.wordpress.com/2015/01/15/how-to-open-and-close-flyouts-in-universal-apps-using-mvvm/
运行良好。但它不适用于编译绑定(bind)(x:Bind)
这个:
<Flyout local:FlyoutHelpers.Parent="{x:Bind ShowButton}"...
除此之外:
<Flyout local:FlyoutHelpers.Parent="{Binding ElementName=ShowButton}"...
构建时抛出奇怪的错误:
Error CS1503 Argument 1: cannot convert from 'Windows.UI.Xaml.Controls.Flyout' to 'Windows.UI.Xaml.FrameworkElement'
是否有任何选项如何使用 x:Bind?
请您参考如下方法:
这里的问题与 {x:Bind}
的生成代码有关。 。
据我们所知{x:Bind}
使用生成的代码来实现其好处。这些代码可以在 obj 文件夹中找到,其名称类似于(对于 C#)< View 名称>.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
在这个特殊的场景下。