我已在 .NET9 MAUI 中打开 CompiledBindings,我正在尝试找出如何解决所有警告。 在我后面的代码中,我有一个名为 Count 的 BindableProperty:
public partial class CountRound : ContentView
{
public static readonly BindableProperty CountProperty =
BindableProperty.Create("Count", typeof(int), typeof(CountRound), 0);
public int Count
{
get => (int)GetValue(CountProperty);
set => SetValue(CountProperty, value);
}
public CountRound()
{
InitializeComponent();
}
}
在.NET8中,我为ContentView设置BindingContext并将标签文本绑定到Count:
<?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:models="clr-namespace:MyApp.Models"
x:Class="MyApp.ContentViews.CountRound"
BindingContext="{Binding Source={RelativeSource Self}}">
<Border x:Name="CountBorder"
StrokeShape="Ellipse"
StrokeThickness="2"
Stroke="{Binding Source={x:Static models:SiteConfiguration.RoundBorderColor}}"
BackgroundColor="White"
Opacity=".85"
HeightRequest="24">
<Label
Text="{Binding Count}"
FontSize="12"
TextColor="Black"
HorizontalOptions="Center"
VerticalOptions="Center"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"
Padding="0"/>
</Border>
</ContentView>
BindingContext 的 DataContext 将自身解析为 CountRound,标签的文本正确解析为 Count,并且 Border Stroke 识别出它是一种 Color:
在 .NET9 中,此代码会导致编译器警告应在 BindingContext 和 Border Stroke 行上设置 DataType,因此我在 ContentView 和 Border Stroke 上发送了 DataType:
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:JMoApp.Models"
xmlns:contentViews="clr-namespace:JMoApp.ContentViews"
x:Class="JMoApp.ContentViews.CountRound"
x:DataType="contentViews:CountRound"
BindingContext="{Binding Source={RelativeSource Self}}">
<Border x:Name="CountBorder"
StrokeShape="Ellipse"
StrokeThickness="2"
Stroke="{Binding x:DataType=Color, Source={x:Static models:SiteConfiguration.RoundBorderColor}}"
BackgroundColor="White"
Opacity=".85"
HeightRequest="24">
<Label
Text="{Binding Count}"
FontSize="12"
TextColor="Black"
HorizontalOptions="Center"
VerticalOptions="Center"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"
Padding="0" />
</Border>
</ContentView>
这解决了关于边框描边的编译器警告,但没有解决绑定上下文的警告,即使它将 BindingContext 的 DataContext 解析为正确的类型:
然后我将 DataType 声明移至 BindingContext 内:
确实清除了该行上的编译器警告,但现在标签文本已解析为数据类型“BindingExtension”,并且无法再解析属性“Count”
所以我将 DataType 添加回 ContenctView,但这会创建一个新警告:
当我将 BindingContext 设置为 CountRound 时,为什么它会解析为 BindingExtenstion? 为什么需要在ContentView和BindingContext中设置DataType? 数据类型应该如何/在哪里定义?
对于自定义控件,您不必为整个类设置
BindingContext
。如果你想将 Text
属性绑定到代码后面的 Count
属性,试试这个,
设置自定义控件的 x:Name,
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp.CountRound"
...
x:Name="myContentView">
并使用 x:Reference 表达式,
<Label
Text="{Binding Count,Source={x:Reference myContentView}}"
欲了解更多信息,请参阅x:参考标记扩展。