c# - 使用x :Bind with attached property (showing flyout)

标签 c# mvvm win-universal-app compiled-bindings

我根据这篇文章制作了“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是我的项目的命名空间。您这边的名称可能有所不同。 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在这个特殊的场景下。

关于c# - 使用x :Bind with attached property (showing flyout),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37081971/

相关文章:

c# - UWP NavigationView 标题标题

c# - 551 发件人地址对您的登录无效

c# - VS2017 MSBuildWorkspace fails opening with converted ASP.Net Core Web application 解决方案

c# - 您是否在任何地方都使用 1-3 个字母的变量?

wpf - 在WPF中打印多页

c# - 双败赛数据结构

c# - UWP 窗口内容不随窗口调整大小

visual-studio - 如何安装适用于 Visual Studio 2015 的旧版本 "SQLite for Universal Windows Platform"SDK?

xaml - Flyout 转换问题中的 ListView

mvvm - 更改 itemssource 绑定(bind)属性 mvvm