如何自定义Xamarin表单ListView SelectedItem ViewCell可见性?

时间:2016-05-06 11:37:40

标签: .net xaml xamarin xamarin.forms

在Xamarin Forms XAML中,如果没有选择,我想隐藏部分ViewCell。 例如,带有text =“仅在选中时显示”的第二个标签。 如何在没有代码的情况下使用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>

2 个答案:

答案 0 :(得分:2)

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

<强>的ViewModels

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

public class ItemViewModel : INotifyPropertyChanged
{
    ......

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if(_selectedItem != value)
            {
                _isSelected = value;
                OnPropertyChanged();
            }
        }
    }
}

然后在页面的viewmodel中,为绑定ListView的{​​{1}}设置另一个属性*,在setter中你可以相应地设置SelectedItem值:

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项viewmodel:

ListView

*)属性需要是一个公共属性,在实现<Label Text="Show only if selected" IsVisible="{Binding IsSelected}"/> 的类中,或者继承实现它的其他类,属性相应地引发属性更改通知,如在上面的片段中举例说明。

供参考:

答案 1 :(得分:0)

列表视图中的每个项目都需要具有“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 ;
    }