当我 select 一个项目时,如何切换数据模板中的组件?
How can I toggle component in datatemplate, when I select an item?
我的页面中有一个 CollectionView,它显示项目。我需要切换视觉指示器(复选标记),该项目已被选中。复选标记应该是风格化的,但我没有做过,我只用 BoxView 试过。似乎没有什么合理的工作。
我曾尝试在我的模型中设置一个标志,如果项目被选中,然后重新加载集合,但这是一个非常糟糕的方法,它也会消耗大量资源。我只需要一个开关,它会在点击项目时出现并在第二次点击时消失。
<Label Text="{Binding price, Converter={StaticResource Price}}" Style="{StaticResource PriceLabel}" Grid.Row="0" Grid.ColumnSpan="2"/>
<Label Text="{Binding name}" Style="{StaticResource CommonLabel}" VerticalTextAlignment="Center" Grid.Row="1" Grid.ColumnSpan="2"/>
<!-- Somehow change this-->
<BoxView BackgroundColor="Blue" Grid.Row="0" Grid.Column="1"/>
期望的结果应该类似于 this 但那是故事的另一部分
我明白了什么
您正试图在项目被选中时显示一个指示器,但同时只能选择一个项目
因此您需要在您的 CollectionView 中将 SelectionMode 设置为 Single,这样一次只能选择一个项目
然后您可以使用 OnCollectionViewSelectionChanged
在所选项目上显示指示器并在前一个项目上隐藏它
您可以在此处找到更多详细信息Xamarin-Collectionview-Selection
根据你的描述,如果你想让BoxView在Collectionview item中显示选中或未选中,建议你可以使用一个属性绑定BoxView IsVisible,我做了一个例子,你可以看看:
型号:
public class Model:ViewModelBase
{
private string _DisplayName;
public string DisplayName
{
get { return _DisplayName; }
set
{
_DisplayName = value;
RaisePropertyChanged("DisplayName");
}
}
private bool _selected;
public bool Selected
{
get { return _selected; }
set
{
_selected = value;
RaisePropertyChanged("Selected");
}
}
}
视图模型:
public class collectionviewmodel:ViewModelBase
{
public ObservableCollection<Model> Items { get; set; }
public collectionviewmodel()
{
Items = new ObservableCollection<Model>();
Items.Add(new Model() { DisplayName = "AAA", Selected = false });
Items.Add(new Model() { DisplayName = "BBB", Selected = false });
Items.Add(new Model() { DisplayName = "CCC", Selected = false });
Items.Add(new Model() { DisplayName = "DDD", Selected = false });
Items.Add(new Model() { DisplayName = "EEE", Selected = false });
}
}
内容页:
<CollectionView
x:Name="list1"
ItemsLayout="VerticalList"
ItemsSource="{Binding Items}"
SelectionChanged="List1_SelectionChanged"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal">
<Label
HorizontalOptions="StartAndExpand"
Text="{Binding DisplayName}"
TextColor="Fuchsia" />
<BoxView
HorizontalOptions="End"
IsVisible="{Binding Selected}"
Color="Fuchsia" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
public Page23 ()
{
InitializeComponent ();
this.BindingContext = new collectionviewmodel();
}
截图是这样的:
我的页面中有一个 CollectionView,它显示项目。我需要切换视觉指示器(复选标记),该项目已被选中。复选标记应该是风格化的,但我没有做过,我只用 BoxView 试过。似乎没有什么合理的工作。
我曾尝试在我的模型中设置一个标志,如果项目被选中,然后重新加载集合,但这是一个非常糟糕的方法,它也会消耗大量资源。我只需要一个开关,它会在点击项目时出现并在第二次点击时消失。
<Label Text="{Binding price, Converter={StaticResource Price}}" Style="{StaticResource PriceLabel}" Grid.Row="0" Grid.ColumnSpan="2"/>
<Label Text="{Binding name}" Style="{StaticResource CommonLabel}" VerticalTextAlignment="Center" Grid.Row="1" Grid.ColumnSpan="2"/>
<!-- Somehow change this-->
<BoxView BackgroundColor="Blue" Grid.Row="0" Grid.Column="1"/>
期望的结果应该类似于 this 但那是故事的另一部分
我明白了什么
您正试图在项目被选中时显示一个指示器,但同时只能选择一个项目
因此您需要在您的 CollectionView 中将 SelectionMode 设置为 Single,这样一次只能选择一个项目
然后您可以使用 OnCollectionViewSelectionChanged
在所选项目上显示指示器并在前一个项目上隐藏它您可以在此处找到更多详细信息Xamarin-Collectionview-Selection
根据你的描述,如果你想让BoxView在Collectionview item中显示选中或未选中,建议你可以使用一个属性绑定BoxView IsVisible,我做了一个例子,你可以看看:
型号:
public class Model:ViewModelBase
{
private string _DisplayName;
public string DisplayName
{
get { return _DisplayName; }
set
{
_DisplayName = value;
RaisePropertyChanged("DisplayName");
}
}
private bool _selected;
public bool Selected
{
get { return _selected; }
set
{
_selected = value;
RaisePropertyChanged("Selected");
}
}
}
视图模型:
public class collectionviewmodel:ViewModelBase
{
public ObservableCollection<Model> Items { get; set; }
public collectionviewmodel()
{
Items = new ObservableCollection<Model>();
Items.Add(new Model() { DisplayName = "AAA", Selected = false });
Items.Add(new Model() { DisplayName = "BBB", Selected = false });
Items.Add(new Model() { DisplayName = "CCC", Selected = false });
Items.Add(new Model() { DisplayName = "DDD", Selected = false });
Items.Add(new Model() { DisplayName = "EEE", Selected = false });
}
}
内容页:
<CollectionView
x:Name="list1"
ItemsLayout="VerticalList"
ItemsSource="{Binding Items}"
SelectionChanged="List1_SelectionChanged"
SelectionMode="Single">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal">
<Label
HorizontalOptions="StartAndExpand"
Text="{Binding DisplayName}"
TextColor="Fuchsia" />
<BoxView
HorizontalOptions="End"
IsVisible="{Binding Selected}"
Color="Fuchsia" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
public Page23 ()
{
InitializeComponent ();
this.BindingContext = new collectionviewmodel();
}
截图是这样的: