我正在毛伊岛-Xamarin创建一个Listview,我想要显示一个按钮来查看选定行中的更多详细信息.但仅在选定的行中.

编辑:问题是如何在选中某个项目时显示该按钮,而在未选中时隐藏该按钮.

<ListView x:Name="listView"
    ItemsSource="{Binding Items}"
    SelectedItem="{Binding SelectedItem}">

  <ListView.ItemTemplate>
    <DataTemplate>
      <ViewCell>
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition Height="44"/>
          </Grid.RowDefinitions>

          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
          </Grid.ColumnDefinitions>

          <Label Text="{Binding Name}" Grid.Column="0"/>

          <Button x:Name="btnViewDetails"
            Grid.Column="1"
            Text="View"
            CornerRadius="50"
            IsVisible="{Binding "WHEN THIS LINE IS SELECTED"}}"/>

        </Grid>
      </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

我try 使用Converter和DataTrigger,但无法将所选项目作为参数传递

推荐答案

我在这里分享两个解决方案.这就是我得到的效果,

enter image description here

选项1

ListView有ItemSelected个事件.每次我们 Select 一项时,ListView都将调用此事件处理程序.因此,我们可以在此事件处理程序中添加一些逻辑:

在XAML中,为ListView添加ItemSelected事件

<ListView x:Name="listView"
    ItemsSource="{Binding Items}"
    SelectedItem="{Binding SelectedItem}"
    ItemSelected="listView_ItemSelected">

在后面的代码中,

     MainPageViewModel viewModel;
     public MainPage()
     {
         InitializeComponent();
         this.BindingContext = viewModel= new MainPageViewModel();

     }

    ...
    private void listView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        //here we find the corresponding item we select in the ListView
        foreach(Item item in viewModel.Items) 
        { 
            if(e.SelectedItem == item) 
            { 
                item.IsVisible = true;
            }
            else
            {
                item.IsVisible = false; 
            }
        }
    }

使用这种方法,记得为模型项实现INotifyPropertyChanged

public class Item : INotifyPropertyChanged
{

    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));

        }
    }

    private bool isVisible;
    public bool IsVisible 
    {
        get
        {
            return isVisible;
        }

        set
        {
            isVisible = value;
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(IsVisible)));
        }      
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

选项2

由于您已经绑定了SelectedItem,因此可以在SelectedItem的Setter中实现上述逻辑,

    private Item selectedItem;
    public Item SelectedItem
    {
        get
        {
            return selectedItem;
        }
        set
        {
            selectedItem = value;
            foreach (var item in Items) 
            { 
                if(selectedItem != item) 
                { 
                    item.IsVisible = false;
                }
                else
                {
                    item.IsVisible = true;
                }               
            }
        }
    }

您还必须为模型项实现INotifyPropertyChanged.

如果你还有什么问题,尽管问我.

希望它能帮上忙!

Csharp相关问答推荐

MongoDB实体框架核心:表达必须可写

EF Core Fluent API中定义的多对多关系

更改对象的旋转方向

如何使用C#中的图形API更新用户配置文件图像

错误401未授权ASP.NET Core.使用JWT创建身份验证/授权

使用命令初始化可绑定属性

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

Azure Redis缓存与Entra ID身份验证

有没有办法使.NET 6应用程序在特定的.NET 6运行时版本上运行

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

C#带主体的主构造函数?

如何在Akka.NET中重新启动执行元时清除邮箱

如何正确处置所有动态控件?

Visual Studio,Docker容器-容器调用:连接被拒绝

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

c#在后台实现类型化数组

如何设置WinForms按钮焦点,使其看起来像是被Tab键插入其中?

C#定时器回调对象上下文?

根据运行时值获取泛型类型的字典

无法创建工具窗口(用于VBIDE、VBA的COM加载项扩展)