Skip to main content
 首页 » 编程设计

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

2024年12月31日14kenshinobiy

我根据这篇文章制作了“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在这个特殊的场景下。