【问题标题】:How to get the corresponding object from collection view when a button is pressed?按下按钮时如何从集合视图中获取相应的对象?
【发布时间】:2021-01-26 23:47:39
【问题描述】:

我有一个CollectionView,每个项目包含 2 个按钮。编辑和删除。我想在按下按钮时删除或编辑项目。但问题是当按下内部按钮时,如何获取该特定项目的相应对象?因为选择模式设置为无,按下按钮也不会选择项目。所以我无法通过以下方式访问该项目 - (Model)collView.SelectedItem.Constructor.... (//Do something where x:Name = collView).

这是我尝试过的 -

<CollectionView x:Name="RequestCollectionView"
                SelectionMode="None"
                Margin="0,35,0,0">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="users:Student">
            <StackLayout>
                    <Label x:Name="studentName"
                           Text="{Binding Name}"
                           Margin="0,25,0,0"/>
                    <Button x:Name="acceptBtn"
                            Clicked="AcceptBtn_Clicked"
                            HeightRequest="24" 
                            WidthRequest="24"/>
                    <Button x:Name="rejectBtn"
                            Clicked="RejectBtn_Clicked"
                            HeightRequest="24" 
                            WidthRequest="24" 
                            Margin="0,0,15,0"/>
            </StackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

我尝试了以下方法,但没有成功 ->

private void AcceptBtn_Clicked(object sender, EventArgs e)
{
    // Here I get NullRef Exception
    testText.Text =
        ((Student)RequestCollectionView.SelectedItem).Name;
   // var t = (Student)sender; //Invalid Cast
}

如果标题不合适,请建议或编辑。我找不到这个问题的适当标题。原谅我。

【问题讨论】:

    标签: c# xaml xamarin.forms binding collectionview


    【解决方案1】:

    将 CommandParameter 添加到您的按钮

    <Button x:Name="acceptBtn"
            Clicked="AcceptBtn_Clicked"
            HeightRequest="24" 
            WidthRequest="24"
            CommandParameter="{Binding .}"/>
    <Button x:Name="rejectBtn"
            Clicked="RejectBtn_Clicked"
            HeightRequest="24" 
            WidthRequest="24" 
            Margin="0,0,15,0"
            CommandParameter="{Binding .}"/>
    

    事件处理

    private void AcceptBtn_Clicked(object sender, EventArgs e)
    {
        if(sender is Button b && b.CommandParameter is Student student)
        {
           testText.Text = student.Name;
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用BindingContext

      private void AcceptBtn_Clicked(object sender, EventArgs e)
      {
          var btn = (Button) sender;
          var student = (Student)btn.BindingContext;
      
          testText.Text = student.Name;
      
      }
      

      【讨论】:

      • 第三行写着System.InvalidCastException: 'Specified cast is not valid.' :(
      • 根据您发布的代码,Student 应该是正确的类型。如果不是,您需要使用调试器来确定它认为它真正是什么类型。
      • 其实我不能投这行 -> var btn = (Button) sender; :(
      • 它认为sender是什么类型?
      • 其实我的错,我在真实代码中使用了 ImageButton。没关系。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2014-01-22
      • 2017-09-15
      • 2012-09-23
      相关资源
      最近更新 更多