'FontAwesome'的部分声明不得指定不同的基类

  • 本文关键字:基类 声明 FontAwesome c# maui
  • 更新时间 :
  • 英文 :


我不确定我在这里做错了什么(仍然是新的),但我正试图让xaml和代码工作。我正在尝试创建可以在整个应用程序中重用的小型可重用组件,但是,我得到以下错误:

'FontAwesome'的部分声明不能指定不同的基类。

下面是我正在使用的XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewmodel="clr-namespace:Editor.UI"
xmlns:local="clr-namespace:Editor.UI"
x:DataType="viewmodel:FontAwesome"
x:Class="Editor.UI.FontAwesome">
<VerticalStackLayout>
<Label 
FontFamily="FontAwesomeSharp"
Text="{Binding icon}"
VerticalOptions="Center" 
HorizontalOptions="Center" />
</VerticalStackLayout>
</ContentView>

这是我在模板旁边使用的c#:

using CommunityToolkit.Mvvm.ComponentModel;
namespace Editor.UI;
partial class FontAwesome : ObservableObject {
[ObservableProperty]
public string icon = "";
}

我需要用不同的东西替换xaml中的ContentView吗?如果我更改代码以扩展ContentView,错误就会消失。那么我需要在xaml中改变什么来使用ObservableObject呢?

问题1

类在c#中只能使用单继承。当使用partial类时,声明必须使用相同的基类。

在视图后面的代码中,你已经将基类从ContentView更改为ObservableObject,大概是为了使用MVVM源生成器(参见问题2)。这是不可能的。

如果你没有这样做,那么你已经尝试声明一个与你的视图同名的ViewModel类,这也是不可能的。

<标题>问题2 h1> 不能在View的代码中使用MVVM社区工具包,它只与模型和视图模型一起工作(AFAIK)。 <标题>

3 问题你对icon字段的绑定将不起作用,因为MVVM社区工具包的源生成器,你通过应用[ObservableProperty]属性使用,实际上会创建一个名为Icon的属性(注意大写字母),你需要绑定到它。

<标题>

问题4你已经设置了编译绑定没有ViewModel,你不能使用它直接自绑定到视图的代码后面(至少我从来没有得到它的工作正常)。您应该删除x:DataType或添加一个实际的ViewModel。

<标题>

解决方案1使用不同于View的名称正确添加ViewModel(并修复绑定):

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewmodel="clr-namespace:Editor.UI"
xmlns:local="clr-namespace:Editor.UI"
x:DataType="viewmodel:FontAwesomeViewModel"
x:Class="Editor.UI.FontAwesomeView">
<VerticalStackLayout>
<Label 
FontFamily="FontAwesomeSharp"
Text="{Binding Icon}"
VerticalOptions="Center" 
HorizontalOptions="Center" />
</VerticalStackLayout>
</ContentView>

代码后面

namespace Editor.UI;
partial class FontAwesomeView : ContentView
{
public FontAwesomeView()
{
InitializeComponent();
BindingContext = new FontAwesomeViewModel();
}
}

ViewModel

public partial class FontAwesomeViewModel : ObservableObject
{
[ObservableProperty]
private string icon;
}
<标题>解决方案2 h1> 过使用ViewModel,继承ContentView并直接绑定到后面的代码:

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewmodel="clr-namespace:Editor.UI"
xmlns:local="clr-namespace:Editor.UI"
x:Name="MyView"
x:Class="Editor.UI.FontAwesome">
<VerticalStackLayout>
<Label 
FontFamily="FontAwesomeSharp"
Text="{Binding Icon, Source={x:Reference MyView}}"
VerticalOptions="Center" 
HorizontalOptions="Center" />
</VerticalStackLayout>
</ContentView>

代码后面

namespace Editor.UI;
partial class FontAwesome : ContentView
{
private string icon;
public string Icon
{
get => icon;
set
{
if(icon.Equals(value)) return;
icon = value;
OnPropertyChanged();
}
}
public FontAwesomeView()
{
InitializeComponent();
}
}

最新更新