私は 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でこれを実現したいと思います。