ListView 선택 항목 가져오기/설정
문제
ListView 선택 항목을 프로그래밍 방식으로 조작하려면 VM에
IsSelected
속성을 제공하고 ListViewItem.IsSelected
에 바인딩해야합니다.<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListView.ItemContainerStyle>
라고 하는 기술이 빙글빙글 잘 발견되지만, 이것은 올바르지 않다.
ListView는 디폴트로 가상화되기 때문에, 보이는 범위 +α의 분 밖에 ListViewItem의 인스턴스는 생성되지 않는다. ListViewItem이 존재하지 않으면 바인딩도 작동하지 않기 때문에 범위 밖의 항목에 대해서는 V와 VM에서의 동기화는 행해지지 않는다.
실제로 어떤 움직임이 될지 간단한 테스트 프로그램으로 확인해 보았다.
테스트 프로그램
설명
화면은 이런 느낌.
item.cs
public class Item : INotifyPropertyChanged
{
public string Name { get; }
public bool IsSelected { get; set; }
}
이런 느낌의 ViewModel이 있고, 그 컬렉션(요소수 50, Name=00~49)이 왼쪽 위의 ListView와 오른쪽의 ItemsControl의 ItemsSource로 지정되어 있다.
ListView 쪽에서는
ListViewItem.IsSelected
와 Item.IsSelected
가 쌍방향으로 Binding 되고 있어 ItemsControl 쪽에서는 Item.IsSelected
가 true 라면 배경색이 바뀌게 되어 있다.출처는 여기
움직여 보자
ListView상에서 적당한 아이템을 선택해 보면, ViewModel측의 IsSelected도 true가 된다.
Ctrl+A에서 ListView의 항목을 모두 선택해 봅니다.
ListView.SelectedItems
에는 50항목 모두 제대로 추가되지만, ViewModel측의 IsSelected
는, 화면에 보이고 있는 것+α밖에 바뀌지 않았다.그대로 ListView를 스크롤 해 나가면 그에 따라 ViewModel 측의
IsSelected
도 차례로 true로 바뀝니다.모든 ViewModel
IsSelected
가 true가 된 곳에서, 또 ListView상의 적절한 항목을 클릭해 본다.전체 선택이 해제되어 그 항목만이 선택된 상태가 되므로
SelectedItems.Count
는 1 이 되지만, 화면에 보이지 않는 부분의 ViewModel IsSelected
는 true 그대로.ViewModel 측에서
IsSelected
를 조작했을 때의 거동도 확인한다.ListView에 보이는 Item-01의
IsSelected
를 true로 변경하면 SelectedItems
에도 반영되지만,보이지 않는 Item-49의
IsSelected
를 true로 해도 SelectedItems
에는 반영되지 않는다.해결책
ListViewItem.IsSelected
에 대한 바인딩은 OneWay
(VM -> V 전용)로 설정 ListView.SelectedItems
의 내용은 전혀 신용하지 않습니다. SelectionChanged
이벤트에서 자발적입니다 void lvw_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in e.RemovedItems.Cast<Item>())
item.IsSelected = false;
foreach (var item in e.AddedItems.Cast<Item>())
item.IsSelected = true;
}
라는 것.
IsSelected에 대한 바인딩을 하지 않는다면 SelectedItems를 봐도 괜찮은 것 같지만.
(참고) VirtualizingStackPanel + MVVM + multiple selection
Reference
이 문제에 관하여(ListView 선택 항목 가져오기/설정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wonderful_panda/items/36bf500094cc42f7ea97텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)