在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>
答案 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 ;
}