【问题标题】:How to Customize Xamarin Forms ListView SelectedItem ViewCell Visibility?如何自定义 Xamarin 表单 ListView SelectedItem ViewCell 可见性?
【发布时间】:2016-09-01 11:17:40
【问题描述】:

在 Xamarin Forms XAML 中,如果未选择 ViewCell,我想隐藏它的一部分。 例如第二个带有 text="Show only if selected" 的标签。 如何在没有代码的情况下使用 MVVM 来做到这一点?

<ListView x:Name="listView"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout> <Label Text="Always Show it"/> <Label Text="Show only if selected" IsVisible={Binding somewhere?}/> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>

【问题讨论】:

    标签: .net xaml xamarin xamarin.forms


    【解决方案1】:

    这是一种可能的 MVVM 方法,它不涉及代码隐藏。

    视图模型

    在您的 ListView 项目视图模型中添加一个属性*,以存储指示项目当前是否被选中的信息:

    public class ItemViewModel : INotifyPropertyChanged
    {
        ......
    
        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set
            {
                if(_selectedItem != value)
                {
                    _isSelected = value;
                    OnPropertyChanged();
                }
            }
        }
    }
    

    然后在页面的视图模型中,有另一个属性*用于绑定ListViewSelectedItem,您可以在其设置器中相应地设置IsSelected值:

    private ItemViewModel _selectedItem;
    public ItemViewModel SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            if(_selectedItem != value)
            {
                //update previously selected item, if any :
                if(_selectedItem != null) _selectedItem.IsSelected = false;
    
                //update currently selected item :
                value.IsSelected = true;
    
                _selectedItem = value;
                OnPropertyChanged();
            }
        }
    }
    

    查看

    IsVisible 属性绑定到ListView 项目视图模型:

    <Label Text="Show only if selected" IsVisible="{Binding IsSelected}"/>
    

    *) 该属性必须是公共属性,在实现INotifyPropertyChanged 的类中或继承实现它的其他类,并且该属性会相应地引发属性更改通知,如示例上面的sn-ps。


    供参考:

    【讨论】:

      【解决方案2】:

      列表视图中的每个项目都需要有一个“IsSelected”可绑定属性。然后在您的 listviews ItemSelected 事件中获取项目并将 IsSelected 设置为 true。只需确保保留对当前选定项目的引用,以便在按下新选定项目时将 IsSelected 设置为 false。它应该看起来像这样。

          MyItem _currentlySelectedItem;
          void OnSelection (object sender, SelectedItemChangedEventArgs e)
          {
            if (e.SelectedItem == null) {
              _currentlySelectedItem = null;
              return; //ItemSelected is called on deselection, which results in SelectedItem being set to null
            }
            var selectedItem = e.SelectedItem as MyItem;
            selectedItem .IsSelected= true;
           _currentlySelectedItem.IsSelected= false; /// Make sure to check for null
           _currentlySelectedItem = selectedItem ;
          }
      

      【讨论】:

      猜你喜欢
      • 2020-11-22
      • 1970-01-01
      • 2021-11-08
      • 2018-08-04
      • 2021-05-12
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多