我不确定我在这里做错了什么(仍然是新的),但我正试图让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();
}
}
标题>标题>标题>标题>标题>