来自嵌套listview的SelectedItems

时间:2016-01-29 12:49:06

标签: c# listview windows-phone-8.1 windows-store-apps winrt-xaml

我正在开发一个Windows应用商店应用,其中我有一个嵌套的列表视图,即可扩展的列表视图。要保留子列表视图中的所选项目,我已使用

<ListView Name="FiltersListview" ItemContainerStyle="{StaticResource StretchItemStyle}" SelectionChanged="FiltersListview_SelectionChanged" IsItemClickEnabled="True" ItemClick="FiltersListview_ItemClick" Grid.Row="1" Grid.ColumnSpan="2">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Interactivity:Interaction.Behaviors>
                    <Core:DataTriggerBehavior Binding="{Binding IsSelected}" Value="True">
                        <Core:ChangePropertyAction TargetObject="{Binding ElementName=view1}" PropertyName="Visibility" Value="Collapsed"/>
                        <Core:ChangePropertyAction TargetObject="{Binding ElementName=view2}" PropertyName="Visibility" Value="Visible"/>
                    </Core:DataTriggerBehavior>
                    <Core:DataTriggerBehavior Binding="{Binding IsSelected}" Value="False">
                    <Core:ChangePropertyAction TargetObject="{Binding ElementName=view1}" PropertyName="Visibility" Value="Visible"/>
                        <Core:ChangePropertyAction TargetObject="{Binding ElementName=view2}" PropertyName="Visibility" Value="Collapsed"/>
                    </Core:DataTriggerBehavior>
                </Interactivity:Interaction.Behaviors>
                <Grid Height="50" x:Name="view1">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="3*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Style="{StaticResource PageTextStyle}"/>
                    <Image Margin="10" Grid.Column="1" Source="/Images/arrow-down.png"/>
                    <Rectangle Fill="Black" VerticalAlignment="Bottom" Height="1" Grid.ColumnSpan="2"/>
                </Grid>
                <Grid x:Name="view2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="3*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="50"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Style="{StaticResource PageTextStyle}"/>
                    <Image Margin="10" Grid.Column="1" Source="/Images/arrow-up.png"/>
                    <ListView Margin="20,0" Grid.Row="1" RequestedTheme="Light" Grid.ColumnSpan="2" ItemsSource="{Binding SubList}" SelectionMode="Multiple">
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                                <Setter Property="FontSize" Value="22"/>
                                <Setter Property="VerticalContentAlignment" Value="Center"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </Style>
                        </ListView.ItemContainerStyle>
                    </ListView>
                </Grid>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

并在代码中

private void FiltersListview_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    try
    {
        var item = (sender as ListView).SelectedItem as FilterM;
        if (item != null)
            item.IsSelected = true;
        if (e.RemovedItems.Count > 0)
        {
            foreach (var Nitem in e.RemovedItems)
            {
                (Nitem as FilterM).IsSelected = false;
            }
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}

private void FiltersListview_ItemClick(object sender, ItemClickEventArgs e)
{
    try
    {
        if ((sender as ListView).SelectedItem != null)
        {
            if ((sender as ListView).SelectedItem.Equals(e.ClickedItem))
                (sender as ListView).SelectedItem = null;
            else
                (sender as ListView).SelectedItem = e.ClickedItem;
        }
        else
            (sender as ListView).SelectedItem = e.ClickedItem;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}

我在提出有关它的旧问题之后更改了这个问题from here. 但现在点击一个名为Go的按钮,我想知道每个项目的子列表视图中的所有选定项目。我偶然发现了链接like this,但我没有使用MVVM而且无法使其在我的情况下工作。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我已经想出了解决这个问题的方法。如果有人需要,我会提出我的解决方案。

我已将子列表视图作为参数传递给ViewModel,并在命令的帮助下对其进行了管理。

    <ListView ItemContainerStyle="{StaticResource StretchItemStyle}" SelectionChanged="FiltersListview_SelectionChanged" IsItemClickEnabled="True" ItemClick="FiltersListview_ItemClick" Grid.Row="1" Grid.ColumnSpan="2" Margin="-1,0,1,44" Grid.RowSpan="2">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Interactivity:Interaction.Behaviors>
                        <Core:DataTriggerBehavior Binding="{Binding IsSelected}" Value="True">
                            <Core:ChangePropertyAction TargetObject="{Binding ElementName=view1}" PropertyName="Visibility" Value="Collapsed"/>
                            <Core:ChangePropertyAction TargetObject="{Binding ElementName=view2}" PropertyName="Visibility" Value="Visible"/>
                        </Core:DataTriggerBehavior>
                        <Core:DataTriggerBehavior Binding="{Binding IsSelected}" Value="False">
                            <Core:ChangePropertyAction TargetObject="{Binding ElementName=view1}" PropertyName="Visibility" Value="Visible"/>
                            <Core:ChangePropertyAction TargetObject="{Binding ElementName=view2}" PropertyName="Visibility" Value="Collapsed"/>
                        </Core:DataTriggerBehavior>
                    </Interactivity:Interaction.Behaviors>
                    <Grid Height="50" x:Name="view1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="3*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Style="{StaticResource PageTextStyle}"/>
                        <Image Margin="10" Grid.Column="1" Source="/Images/arrow-down.png"/>
                        <Rectangle Fill="Black" VerticalAlignment="Bottom" Height="1" Grid.ColumnSpan="2"/>
                    </Grid>
                    <Grid x:Name="view2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="3*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="50"/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Style="{StaticResource PageTextStyle}"/>
                        <Image Margin="10" Grid.Column="1" Source="/Images/arrow-up.png"/>
                        <ListView x:Name="SubListview" Margin="20,0" Grid.Row="1" RequestedTheme="Light" Grid.ColumnSpan="2" ItemsSource="{Binding SubList}" SelectionMode="Multiple">
                            <ListView.ItemContainerStyle>
                                <Style TargetType="ListViewItem">
                                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                                    <Setter Property="FontSize" Value="22"/>
                                    <Setter Property="VerticalContentAlignment" Value="Center"/>
                                    <Setter Property="Foreground" Value="Black"/>
                                </Style>
                            </ListView.ItemContainerStyle>
                            <Interactivity:Interaction.Behaviors>
                                <Core:EventTriggerBehavior EventName="SelectionChanged">
                                    <Core:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=SubListview}"/>
                                    <!--<Core:InvokeCommandAction Command="{Binding SelectionChangedCommand}" InputConverter="{StaticResource SelectionChangedConverter}" InputConverterParameter="{Binding ElementName=SubListview}"/>-->
                                </Core:EventTriggerBehavior>
                            </Interactivity:Interaction.Behaviors>
                        </ListView>
                        <Rectangle Grid.Row="1" Fill="Black" VerticalAlignment="Bottom" Height="1" Grid.ColumnSpan="2"/>
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

并在代码中

public class FilterM
{
public RelayCommand<IList<object>> SelectionChangedCommand  
{
    get
    {
        if (selectionChangedCommand == null)
        {
            selectionChangedCommand = new RelayCommand<IList<object>>(
                items =>
                {
                    // do something with selected items!
                }
            );
        }

        return selectionChangedCommand;
    }
}
}

并设置第一个listview的itemssource。我有这个想法from this link.希望它能帮到像我这样的人。