Maui Collection 视图:需要访问 code-behind 中的兄弟控件
Maui Collection View: Need to access sibling controls in code-behind
我在毛伊岛有这样一个 Collection 视图:
<CollectionView Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" WidthRequest="330" HorizontalOptions="Start" x:Name="CvVoting" HeightRequest="350" SelectionMode="Single" SelectionChanged="CvVoting_SelectionChanged" BackgroundColor="BurlyWood" VerticalScrollBarVisibility="Always">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Vertical" Padding="5" HeightRequest="200">
<Label x:Name="lbl_ID" FontSize="Small" Text="{Binding ID}" IsVisible="false"/>
<Label x:Name="lblQName" FontSize="20" Text="{Binding QuestionText}"/>
<RadioButton Content="Abstain" CheckedChanged="RadioButton_CheckedChanged" IsChecked="True"/>
<RadioButton Content="Yes" CheckedChanged="RadioButton_CheckedChanged"/>
<RadioButton Content="No" CheckedChanged="RadioButton_CheckedChanged"/>
<Button x:Name="btnCommit" Text="Commit" Clicked="btnCommit_Clicked" IsEnabled="false"/>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
我需要从我的 code-behind 访问标签 lbl_ID(在按钮 btnCommit 的 Click-event 中)
private void btnCommit_Clicked(object sender, EventArgs e)
{
string ID = e.lbl_ID.Text;
}
显然 e.lbl_ID.Text 是错误的 - 我需要知道放什么才能访问标签的文本。
我们将不胜感激。
我看到您正在尝试使用 DataTemplate
。所以这就是问题所在:DataTemplate
应用于支持 collection 中的每个项目。在您的情况下,无论您为 CvVoting
CollectionView
设置什么 ItemsSource
,对于 collection 中的每个项目,都会显示一个 DataTemplate
。
考虑到这一点;您将如何引用正确的标签?现在可能有数百或数千个 Label
object 具有相同的名称,所以这行不通。
你想做的是使用data-binding。我看到你已经在这样做了!我们以<Label x:Name="lbl_ID" FontSize="Small" Text="{Binding ID}" IsVisible="false"/>
为例。
如果您想在此处更新 ID
,则必须在您的 collection 中更新此项目的 ID
属性(分配的项目在你的 CollectionView
.
上 ItemsSource
正如评论中已经指出的那样;您可能想使用 Button
的 Command
属性 而不是 Clicked
事件。这样你就可以在你的视图模型中触发逻辑而不是你的视图。这里的额外挑战是,如果您像这样设置它,您现在必须在您的模型上实施此命令。虽然实际上您可能想要做的是将此命令添加到您的视图模型并使用 CommandParameter
指定 ID
以便您知道要更新哪个 object。
所有这些基本上都是 MVVM 模式。您不想引用任何 UI 元素来捕获或更新值。您将始终通过 objects.
的支持来做到这一点
这是一个很难通过文字来解释的概念,不知道你想要实现什么。我的 YouTube channel 上也有一些关于数据绑定的视频,也许有帮助。除了这个播放列表之外,还有很多其他可能有用的东西。
我在毛伊岛有这样一个 Collection 视图:
<CollectionView Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" WidthRequest="330" HorizontalOptions="Start" x:Name="CvVoting" HeightRequest="350" SelectionMode="Single" SelectionChanged="CvVoting_SelectionChanged" BackgroundColor="BurlyWood" VerticalScrollBarVisibility="Always">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Vertical" Padding="5" HeightRequest="200">
<Label x:Name="lbl_ID" FontSize="Small" Text="{Binding ID}" IsVisible="false"/>
<Label x:Name="lblQName" FontSize="20" Text="{Binding QuestionText}"/>
<RadioButton Content="Abstain" CheckedChanged="RadioButton_CheckedChanged" IsChecked="True"/>
<RadioButton Content="Yes" CheckedChanged="RadioButton_CheckedChanged"/>
<RadioButton Content="No" CheckedChanged="RadioButton_CheckedChanged"/>
<Button x:Name="btnCommit" Text="Commit" Clicked="btnCommit_Clicked" IsEnabled="false"/>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
我需要从我的 code-behind 访问标签 lbl_ID(在按钮 btnCommit 的 Click-event 中)
private void btnCommit_Clicked(object sender, EventArgs e)
{
string ID = e.lbl_ID.Text;
}
显然 e.lbl_ID.Text 是错误的 - 我需要知道放什么才能访问标签的文本。
我们将不胜感激。
我看到您正在尝试使用 DataTemplate
。所以这就是问题所在:DataTemplate
应用于支持 collection 中的每个项目。在您的情况下,无论您为 CvVoting
CollectionView
设置什么 ItemsSource
,对于 collection 中的每个项目,都会显示一个 DataTemplate
。
考虑到这一点;您将如何引用正确的标签?现在可能有数百或数千个 Label
object 具有相同的名称,所以这行不通。
你想做的是使用data-binding。我看到你已经在这样做了!我们以<Label x:Name="lbl_ID" FontSize="Small" Text="{Binding ID}" IsVisible="false"/>
为例。
如果您想在此处更新 ID
,则必须在您的 collection 中更新此项目的 ID
属性(分配的项目在你的 CollectionView
.
ItemsSource
正如评论中已经指出的那样;您可能想使用 Button
的 Command
属性 而不是 Clicked
事件。这样你就可以在你的视图模型中触发逻辑而不是你的视图。这里的额外挑战是,如果您像这样设置它,您现在必须在您的模型上实施此命令。虽然实际上您可能想要做的是将此命令添加到您的视图模型并使用 CommandParameter
指定 ID
以便您知道要更新哪个 object。
所有这些基本上都是 MVVM 模式。您不想引用任何 UI 元素来捕获或更新值。您将始终通过 objects.
的支持来做到这一点这是一个很难通过文字来解释的概念,不知道你想要实现什么。我的 YouTube channel 上也有一些关于数据绑定的视频,也许有帮助。除了这个播放列表之外,还有很多其他可能有用的东西。