DataGrid Multiselection 문의드립니다.

안녕하세요.

자주 문의를 드리게 되네요. 제가 문의드리는 내용은 구글링을 해보고 예제를 적용해보고 안되는 내용에 대해서 문의드리는 거니까 혹시 고민을 많이 안하고 문의하는건 아닌지 하시는 분이 계실까봐 미리 말씀드립니다.

우선 저는 데이터 그리드에서 멀티 셀렉션을 했을 때, 데이터가 Collection 타입 (IList, IEnumerable, IObservableCollection 등)으로 바인딩 시키고 싶은데 제가 본 예제들은 null로만 나와서 따로 예제를 만들어서 문의드립니다.

예제 다운로드

도움 부탁드립니다.

감사합니다.

#제가 참고하다 잘 안되었던 곳 링크

2개의 좋아요

하다보니 해결됐습니다.

해결된 답안 링크 만들어서 올릴께요

해결된 예제

4개의 좋아요

@WPF 예제 잘 봤습니다. :smile:

이미 좋은 해답을 찾아 놓으셨네요. 본문에 적어주신 StackOverflow 해결 방법 중에서 IsSelected를 응용하는 방법이 있는데요.


1. 가장 먼저 DemoView.xaml에서 DataGrid 안에 DataGridRow 스타일 추가
2. 심심하니까 SelectedItem도 하나 추가하죠~ {Binding CurrentItem}

<DataGrid ...
     	  ItemsSource="{Binding Items}"
          SelectedItem="{Binding CurrentItem}">
    <DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </DataGrid.Resources>
</DataGrid>

DataGridRow 행의 선택이 변경될 때 마다 IsSelected 속성 값이 모델의 IsSelected에 바인딩 되도록 합니다. 그럼 나중에 Linq 등으로 손쉽게 선택된 행을 가져올 수 있겠네요.

3. ObservableCollection 모델에 IsSelected 속성 추가 (ItemViewModel.cs)

private bool _isSelected;
public bool IsSelected
{
    get { return _isSelected; }
    set
    {
        _isSelected = value;
        NotifyOfPropertyChange(() => IsSelected);
    }
}

4. 마지막으로 DemoViewModel.cs 안에 CurrentItem 속성 추가

public ItemViewModel CurrentItem
{
    get => _currentItem;
    set 
    { 
        NotifyOfPropertyChange(() => CurrentItem);
        List<ItemViewModel> selectedItems = Items.Where(x => x.IsSelected).ToList();
    }
}

Items 전체 목록에서 IsSelected = true 항목만 가져옵니다.


그리고 개인적으로 GitHub를 통해서 예제 소스를 제공해주시거나 관리하시면 엄청 좋으실 것 같아요~

4개의 좋아요

감사합니다~ 좋은자료네요.
잘 참고 하겠습니다.

감사합니다!!

3개의 좋아요