如何使用 SelectionMode=Multiple 从 GridView 获取选定的控件
How to get selected controls from GridView with SelectionMode=Multiple
我有一个这样的 GridView:
<GridView x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="list_SelectionChanged" ItemsSource="{x:Bind Wallpapers}" SelectionMode="Multiple">
<GridView.ItemTemplate>
<DataTemplate x:DataType="data:ImageItem">
<StackPanel>
<Image FlyoutBase.AttachedFlyout="{StaticResource ImageMenuFlyout}" Width="150" Height="90" Source="{x:Bind img}" Tag="{x:Bind TagIndex}" Holding="Image_Holding" Tapped="Image_Tapped"/>
<Image Source="used.png" Height="15" Margin="0,-15,0,0" HorizontalAlignment="Left" Width="44" Visibility="{x:Bind Used, Mode=OneWay}"/>
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
我需要在 GrifView 的 OnSelectionChanged 方法上获取第二个图像控件的可见性。
我需要这个,因为如果用户 select 至少有一个项目对 "Visible" 具有第二个图像控件的可见性,我必须启用一个按钮。
已尝试重新创建您的示例。
我假设您有一个名为 ImageItem
的 class。我创建了一个只有 Used
属性:
public class ImageItem
{
public Visibility Used { get; set; }
}
我的观点和你的基本一致,我使用了不同的ItemsSource
名称,只在第二个Image
控件的Visibility
绑定中留下:
<GridView x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="List_OnSelectionChanged" ItemsSource="{x:Bind Items}" SelectionMode="Multiple">
<GridView.ItemTemplate>
<DataTemplate x:DataType="local:ImageItem">
<StackPanel>
<Image Width="150" Height="90" />
<Image Height="15" Margin="0,-15,0,0" HorizontalAlignment="Left" Width="44" Visibility="{x:Bind Used, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
我将其绑定到以下集合:
Items = new ObservableCollection<ImageItem>
{
new ImageItem() { Used = Visibility.Visible },
new ImageItem() { Used = Visibility.Visible },
new ImageItem() { Used = Visibility.Collapsed },
};
所以只有第三项的第二个Image
被隐藏了。
我的 selection 更改处理程序如下:
private void List_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var gridView = sender as GridView;
if (gridView != null)
{
var isAtLeastOneVisible =
gridView.SelectedItems.OfType<ImageItem>().Any(i => i.Used == Visibility.Visible);
}
}
因此,如果您 select 至少第一个 and/or 列表中的第二个项目,那么 isAtLeastOneVisible
将为真,如果您只 select第三项.
我有一个这样的 GridView:
<GridView x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="list_SelectionChanged" ItemsSource="{x:Bind Wallpapers}" SelectionMode="Multiple">
<GridView.ItemTemplate>
<DataTemplate x:DataType="data:ImageItem">
<StackPanel>
<Image FlyoutBase.AttachedFlyout="{StaticResource ImageMenuFlyout}" Width="150" Height="90" Source="{x:Bind img}" Tag="{x:Bind TagIndex}" Holding="Image_Holding" Tapped="Image_Tapped"/>
<Image Source="used.png" Height="15" Margin="0,-15,0,0" HorizontalAlignment="Left" Width="44" Visibility="{x:Bind Used, Mode=OneWay}"/>
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
我需要在 GrifView 的 OnSelectionChanged 方法上获取第二个图像控件的可见性。
我需要这个,因为如果用户 select 至少有一个项目对 "Visible" 具有第二个图像控件的可见性,我必须启用一个按钮。
已尝试重新创建您的示例。
我假设您有一个名为 ImageItem
的 class。我创建了一个只有 Used
属性:
public class ImageItem
{
public Visibility Used { get; set; }
}
我的观点和你的基本一致,我使用了不同的ItemsSource
名称,只在第二个Image
控件的Visibility
绑定中留下:
<GridView x:Name="list" ScrollViewer.VerticalScrollBarVisibility="Hidden" SelectionChanged="List_OnSelectionChanged" ItemsSource="{x:Bind Items}" SelectionMode="Multiple">
<GridView.ItemTemplate>
<DataTemplate x:DataType="local:ImageItem">
<StackPanel>
<Image Width="150" Height="90" />
<Image Height="15" Margin="0,-15,0,0" HorizontalAlignment="Left" Width="44" Visibility="{x:Bind Used, Mode=OneWay}" />
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
我将其绑定到以下集合:
Items = new ObservableCollection<ImageItem>
{
new ImageItem() { Used = Visibility.Visible },
new ImageItem() { Used = Visibility.Visible },
new ImageItem() { Used = Visibility.Collapsed },
};
所以只有第三项的第二个Image
被隐藏了。
我的 selection 更改处理程序如下:
private void List_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var gridView = sender as GridView;
if (gridView != null)
{
var isAtLeastOneVisible =
gridView.SelectedItems.OfType<ImageItem>().Any(i => i.Used == Visibility.Visible);
}
}
因此,如果您 select 至少第一个 and/or 列表中的第二个项目,那么 isAtLeastOneVisible
将为真,如果您只 select第三项.