0

私は 2 つの ListViews を持っています。最初は MultipleSelection 対応の ListView です。ユーザーが最初の ListView から項目をクリックすると、2 番目の ListView に追加され、最初の ListView から項目の選択を解除すると、2 番目の ListView から項目が削除されます。

私の問題は、ユーザーが2番目のListView(すでに実装されている)からListViewItemを削除し、最初のListViewでアイテムの選択を解除できるようにすることです。問題なくアイテムを削除できますが、最初の ListView でそのアイテムの選択を解除する方法が必要です

  <ListView.ItemTemplate>
                <DataTemplate >
                    <RelativePanel >
                        <TextBlock Text="{Binding Name}" RelativePanel.LeftOf="MoveButton"/>
                        <Button  Name="MoveButton" Command="{Binding ElementName=NaughtySelectionList, Path=DataContext.MoveCommand}" 
                                 CommandParameter="{Binding Id}"  Content="+"  
                                 Style="{StaticResource ButtonClearStyle}"
                                 RelativePanel.AlignRightWithPanel="True" 
                                 RelativePanel.AlignTopWithPanel="True"/>
                    </RelativePanel>
                </DataTemplate>
            </ListView.ItemTemplate> 

        </ListView>
        <ListView Name="NaughytSelectedList" ItemsSource="{Binding SelectedNaughtyChildren}">
            <ListView.ItemTemplate>
                <DataTemplate >
                    <RelativePanel >
                        <TextBlock Text="{Binding Name}" RelativePanel.LeftOf="MoveBackButton"  />
                        <Button Name="MoveBackButton" 
                                Command="{Binding ElementName=NaughytSelectedList, Path=DataContext.MoveBackCommand}"
                                CommandParameter="{Binding Id}"  Content="✖"  
                                Style="{StaticResource ButtonClearStyle}" 
                                RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignTopWithPanel="True" />
                    </RelativePanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

ビューモデル

    private Child selectedChild ;
    public Child SelectedChild
    {
        get { return selectedChild; }
        set { selectedChild = value;


            base.RaisePropertyChanged();
        }
    }


    private DelegateCommand<IList<Object>> selectionChangedCommand;
    public DelegateCommand<IList<Object>> SelectionChangedCommand
        => selectionChangedCommand ?? (selectionChangedCommand = new DelegateCommand<IList<object>>(AddToNaughty, CanAddToNaughty));
    private bool CanAddToNaughty(IList<object> arg)
    {
        return true;

    }

    private void AddToNaughty(IList<object> currentSelection)
{

        var currentSelectionCollection= new ObservableCollection<Child>();

        foreach (var child in currentSelection )
        {
            currentSelectionCollection.Add(child as Child);  
        }

        foreach (var child in currentSelectionCollection)
        {
            if (!SelectedNaughtyChildren.Contains(child))
                SelectedNaughtyChildren.Add(child);
        }


        //Check if an item has been deselected.
        var copyOfSelectedNaughtyChildren =  new ObservableCollection<Child>(SelectedNaughtyChildren);
            var deselectedItems = from child in copyOfSelectedNaughtyChildren
                            where !currentSelectionCollection.Contains(child)
                            select child;


        //Remove the DeselectedItem.
        foreach (var child in deselectedItems)
        {
            SelectedNaughtyChildren.Remove(child);
        }       
    }

    private DelegateCommand<int> moveBackCommand;
    public DelegateCommand<int> MoveBackCommand
        => moveBackCommand ?? (moveBackCommand = new DelegateCommand<int>(DeleteChild, CanDeleteChild));



    private bool CanDeleteChild(int arg)
    {
        return true;
    }

    private void DeleteChild(int id)
    {
        var childMatch = from child in SelectedNaughtyChildren
                         where child.Id == id
                         select child;

        var childToRemove = childMatch.First();
        if (childToRemove != null)
            SelectedNaughtyChildren.Remove(childToRemove);
         //Hear I want to deselect the item from the first ListView
         // setting selected item to null deselects all the items.
        SelectedChild = null;

    }
}

編集:必要な機能を示すためにいくつかの画像を追加しました。私はこれを機能させていますが、コードビハインドを使用することによってのみです。可能であればViewModelでこれを実現したいと思います。

したがって、ユーザーがいくつかの項目を選択すると、右側の ListView に表示されます

ユーザーが右側からアイテムを削除すると、左側で選択が解除されます

4

1 に答える 1

0

SelectedItemsリストからアイテムを削除する必要firstlistview があります コードは次のとおりです

foreach(var item in FirstListView.Items)//or use firstlistview observable collection
{
//Compare item to be deselected
  if(childToRemove  == item)
     FirstListView.SelectedItems.Remove(item);
}
于 2016-05-30T05:04:51.463 に答える