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

正如评论中已经指出的那样;您可能想使用 ButtonCommand 属性 而不是 Clicked 事件。这样你就可以在你的视图模型中触发逻辑而不是你的视图。这里的额外挑战是,如果您像这样设置它,您现在必须在您的模型上实施此命令。虽然实际上您可能想要做的是将此命令添加到您的视图模型并使用 CommandParameter 指定 ID 以便您知道要更新哪个 object。

所有这些基本上都是 MVVM 模式。您不想引用任何 UI 元素来捕获或更新值。您将始终通过 objects.

的支持来做到这一点

这是一个很难通过文字来解释的概念,不知道你想要实现什么。我的 YouTube channel 上也有一些关于数据绑定的视频,也许有帮助。除了这个播放列表之外,还有很多其他可能有用的东西。