无法在 Xamarin Forms 的派生 class 的 XAML 中访问基 class 的成员

Cannot access base class's members in the derived class's XAML in Xamarin Forms

我有一个 DialogView class 派生自基数 class Dialog 又派生自 ContentView,即。 DialogView : Dialog : ContentView。我收到稍后提到的错误。

这是我的 XAML 代码 (DialogView.xaml)

<controls:DialogView xmlns="http://xamarin.com/schemas/2014/forms"
                     ...
                     xmlns:controls="clr-namespace:MyProject.Views.Controls"
                     IsVisible="False"> <!--error: The property 'IsVisible' was not found in 'DialogView'-->

    <ContentView.Content>  <!--error: The attachable property 'Content' was not found in 'ContentView'
        ...
    </ContentView.Content>
</controls:DialogView>

这是我的 C# 代码 (DialogView.xaml.cs)

public class Dialog : ContentView
{
    // Some properties
}

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class DialogView : Dialog  // error: Partial declarations of View must not specify different base classes
{
}

错误:

在 C# 中,基 classes 的 public 成员可在派生 class 中直接访问,因为派生 class 和基 class 共享一个 是一个关系。 XAML 不是这样吗?如何在 XAML.

中访问派生 class 中的基 class 成员

刚注意到一件事。你说 xaml 在 DialogView.xaml 中。如果那是正确的,那你就错了。

根元素的类型必须是 父元素 class。使用 x:Class 声明 class 本身:

<controls:Dialog xmlns...
    x:Class="YourNamespace.DialogView">

替代解决方案

您可能把情况复杂化了。

为什么在DialogView.xaml.cs中同时定义了DialogDialogViewclass?这是可能的,但几乎可以肯定不会做你想要的。

改为这样做:

  1. 向您的项目添加一个新的 ContentView,命名为 Dialog。这将添加两个文件,Dialog.xamlDialog.xaml.cs。在这些文件中,将您想要存在的所有内容放入 all 您的 Dialog.class 子 Dialog.

  2. 向您的项目添加另一个新的 ContentView,命名为 DialogView。这将添加另外两个文件,DialogView.xamlDialogView.xaml.cs。在 xaml 中,将 <ContentView ... 更改为 <controls:Dialog ...。在 cs 中,将 public partial DialogView : ContentView 更改为 public partial DialogView : Dialog。因此,您的 DialogView 现在是一个对话框。构建解决方案(因此智能感知将正确地看到父级从 ContentView 更改为 Dialog。)现在根据需要添加到 xaml 和 cs。

注意:在未来的某个时候(或者可能在 2022 年预览版中已经实现),我希望 VS 可以直接创建一个 xaml-based 继承自自定义视图的控件 class。然后你就不必像我上面为 DialogView 做的那样拼凑,我首先创建一个 ContentView,然后重命名父级 class.