在边界中使用 BindingContext (C# MAUI,适用于 Xamarin/WPF)



我一直在努力让绑定在边界内工作。当我尝试在边界外绑定某些东西时,它工作得很好,但我无法让它在边界内工作。

在这里编写有效的代码:

<DataTemplate x:Key="TaskTemplate">
<GridLayout
ColumnDefinitions="*"
>
<Label Text={Binding Path=TestText}/>
</GridLayout>
</DataTemplate>

此代码正确显示文本。

什么没有,我需要什么才能开始工作:

<DataTemplate x:Key="TaskTemplate">
<GridLayout
ColumnDefinitions="*"
>

<Border
GridLayout.Column="0"
BackgroundColor="{StaticResource MidBackgroundColor}"
StrokeThickness="1"
Stroke="Transparent"
HorizontalOptions="Center">
<Border.StrokeShape>
<RoundRectangle CornerRadius="30"/>
</Border.StrokeShape>

<Label 
Text="{Binding Path=TestText}"/>
</Border>
</GridLayout>
</DataTemplate>

此代码将其显示为空。

根据我目前的理解,边界带走了上下文,我已经尝试了许多其他线程的东西来让它工作,但由于我是新手,我正在努力找出它是如何工作的。

提前感谢!

编辑: 我已经尝试用纯文本替换绑定并且工作得很好,所以边框内的标签并不是不可见的。

我想澄清一下,上述 Text 属性实际上不是标签或边框的 Text 属性,而是有界对象的 Text 属性。为了清楚起见,将其重命名为测试文本。

此代码显示正确的文本:

<GridLayout
ColumnDefinitions="*"
>

<Border
GridLayout.Column="0"
BackgroundColor="{StaticResource MidBackgroundColor}"
StrokeThickness="1"
Stroke="Transparent"
HorizontalOptions="Center">
<Border.StrokeShape>
<RoundRectangle CornerRadius="30"/>
</Border.StrokeShape>

<Label 
Text="Testing text."/>
</Border>
</GridLayout>
</DataTemplate>

期望的结果是:https://i.stack.imgur.com/wUdGD.jpg

但它应该绑定另一个对象的文本,而不是硬编码的文本。这不应该是其他代码的问题,因为如果我在边界之外编写代码,它就可以正常工作。

编辑2: 包括所有其他代码。

这是显示所有内容的页面。

TasksPage.xaml:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
<ContentPage.Resources>
<ResourceDictionary Source="/Views/ViewTask.xaml"/>
</ContentPage.Resources>
<GridLayout RowDefinitions="*">
<GridLayout

GridLayout.Row="0"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<StackLayout Margin="5,5,5,0">
<CollectionView x:Name="TasksCollection"
ItemsSource="{Binding Tasks}"
ItemTemplate="{StaticResource TaskTemplate}">
</CollectionView>
</StackLayout>
</GridLayout>
</GridLayout>
</ContentPage>

TasksPage.xaml.cs:

public partial class TasksPage : ContentPage
{
public TasksPage()
{
InitializeComponent();
BindingContext = new TaskViewModel();
}
}

这是该集合的项模板。 ViewTask.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
<DataTemplate x:Key="TaskTemplate">
<GridLayout
ColumnDefinitions="*">
<Border
GridLayout.Column="0"
BackgroundColor="{StaticResource MidBackgroundColor}"
StrokeThickness="1"
Stroke="Transparent"
HorizontalOptions="Center">
<Border.StrokeShape>
<RoundRectangle CornerRadius="30"/>
</Border.StrokeShape>
<Label GridLayout.Column="0" 
GridLayout.Row="0"
Text="{Binding TaskText}" />
</Border>
</GridLayout>
</DataTemplate>
</ResourceDictionary>

ViewModel只有一个ObservableCollection,它工作得很好。因此,所有项实际上都填充了数据模板,只是数据模板仅在不在边框内时才显示绑定属性。

其他人也认为这是一个错误。莱斯特·莫雷诺在宣布毛伊岛预览版 9 的博客上的评论。

现在,您可以使用"帧内帧"模拟Border

<!-- Without Grid, the Frame takes the whole width. -->
<!-- To have multiple buttons in one row, use more Grid columns. -->
<!-- Border will be more convenient once it works. -->
<Grid ColumnDefinitions="Auto,*">
<!-- "Padding 6" of outer frame determines how thick the Border color is. -->
<Frame HasShadow="False" CornerRadius="18" Padding="6" BackgroundColor="#F69927">
<!-- "Padding 2" of inner frame is white space surrounding the label. -->
<Frame HasShadow="False" CornerRadius="12" BackgroundColor="White" Padding="6,2">
<Label Text="{Binding LabelText}" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"
TextColor="Blue"/>
</Frame>
</Frame>
</Grid>

最新更新