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

shstlldc  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个DialogView类,它派生自基类Dialog,而基类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
{
}

错误:

  • DialogView类是一个分部类,在XAML中定义了视图。我想在XAML中访问该类的IsVisible属性,但无法访问,出现错误:在DialogView中找不到属性“IsVisible”IsVisibleVisualElement的属性,该属性在ContentView中可用,因为它在多个级别上派生自VisualElement,那么为什么它在DialogView中不可用,因为DialogView派生自ContentView
  • 我也不能在DialogView的XAML中使用<ContentView.Content>。我收到一个错误:在“ContentView”中找不到可附加属性“Content”
  • 我还收到错误视图的部分声明不能指定不同的基类我定义public partial class DialogView : Dialog的地方。

在C#中,基类的公共成员可以在派生类中直接访问,因为派生类和基类共享is-a关系。在XAML中不是这样吗?在XAML中如何访问派生类中的基类成员?

46scxncf

46scxncf1#

你说xaml在DialogView.xaml中,如果这是正确的,那么你犯了一个错误。
根元素的类型必须是父类。使用x:Class声明类本身:

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

替代解决方案

你可能把情况弄得过于复杂了。
为什么在DialogView.xaml.cs中定义**DialogDialogView类?这是可能的,但几乎可以肯定这不是您想要的。
请改为执行以下操作:
1.添加一个新的ContentView到你的项目,命名为Dialog。这将添加两个文件,Dialog.xamlDialog.xaml.cs。在这些文件中,把你想要存在的所有东西放在Dialog所有子类中。
1.将另一个新的ContentView添加到您的项目,命名为DialogView。这将添加另外两个文件,DialogView.xamlDialogView.xaml.cs。在xaml中,将<ContentView ...更改为<controls:Dialog ...。在cs中,将public partial DialogView : ContentView更改为public partial DialogView : Dialog。因此,您的对话视图现在是一个对话框。2生成解决方案(这样intellisense将正确地看到从ContentView到Dialog的父更改。3)现在根据需要添加到xaml和cs。
注意:在未来的某个时候(或者可能在2022预览版中已经实现),我希望VS能够直接创建一个基于xaml的控件,该控件继承自您的自定义视图类。这样您就不必像我在上面为DialogView所做的那样做一些杂七杂八的事情,我首先创建一个ContentView,然后重命名父类。

相关问题