Xceed DataGrid를 row : MultiSelect로 설정-선택한 행을 MVVM 행 데이터에 바인딩하는 방법

에릭 우 엘렛

"확장"(다중 선택)으로 설정된 선택 모드에서 Xceed DataGridControl을 사용하고 있습니다.

MVVM을 사용하고 있습니다. 각 행은 MyRowObject 클래스의 인스턴스에 바인딩됩니다. MyRowObject에는 "IsSelected"부울 속성이 있습니다. DataGridControl 행 "IsSelected"속성을 MyRowObject.IsSelected에 바인딩하려고합니다 (있는 경우 읽기 / 쓰기 속성을 찾을 수 없음).

누구든지 Xceed DataGridControl로 할 수 있는지와 어떻게 할 수 있는지 알고 있습니까? 직접 바인딩이 가능하지 않은 경우 누군가 이에 대한 동작을 작성 했습니까?

에릭 우 엘렛

실제로 이것은 직접 할 수 없습니다. 현재까지 모든 버전 (2016-04-25)에 해당됩니다.

그러나 Xceed는 동일한 동작을 수행하는 코드를 제공하기에 충분히 친절했습니다 (아래 참조). 양방향으로 배치하고 예외를 방지하기 위해 코드를 약간 수정했지만 그렇지 않으면 동작이 정확히 내가 찾던 것입니다. "IsSelected"속성으로 하드 코딩되어 있습니다.

사용하는 대신 : DataGridControl, 사용 : DataGridControlCustom.

using System;
using System.ComponentModel;
using System.Reflection;
using System.Windows;
using Xceed.Wpf.DataGrid;

namespace XceedUtil
{
    public class DataGridControlCustom : DataGridControl
    {
        public DataGridControlCustom()
        {
            SelectionChanged += OnSelectionChanged;
        }

        private void OnSelectionChanged(object sender, DataGridSelectionChangedEventArgs e)
        {
            foreach (SelectionInfo selectionInfo in e.SelectionInfos)
            {
                foreach (var item in selectionInfo.AddedItems)
                {
                    PropertyInfo pi = item.GetType().GetProperty("IsSelected", BindingFlags.Public | BindingFlags.Instance);
                    if (pi != null && pi.CanWrite)
                    {
                        pi.SetValue(item, true);
                    }
                }
                foreach (var item in selectionInfo.RemovedItems)
                {
                    PropertyInfo pi = item.GetType().GetProperty("IsSelected", BindingFlags.Public | BindingFlags.Instance);
                    if (pi != null && pi.CanWrite)
                    {
                        pi.SetValue(item, false);
                    }
                }
            }
        }

        protected override DependencyObject GetContainerForItemOverride()
        {
            return new CustomDataRow();
        }
    }

    public class CustomDataRow : DataRow, IWeakEventListener
    {
        protected override void PrepareContainer(DataGridContext dataGridContext, object item)
        {
            base.PrepareContainer(dataGridContext, item);

            PropertyInfo pi = item.GetType().GetProperty("IsSelected", BindingFlags.Public | BindingFlags.Instance);
            if (pi != null && pi.CanWrite)
            {
                if ((bool)pi.GetValue(item) == true)
                {
                    dataGridContext.SelectedItems.Add(item);
                }
            }

            PropertyChangedEventManager.AddListener(item as INotifyPropertyChanged, this, "IsSelected");
        }

        private void UpdateSelectedItems(object item)
        {
            var selectedItems = DataGridControl.GetDataGridContext(this).SelectedItems;
            try
            {
                PropertyInfo pi = item.GetType().GetProperty("IsSelected", BindingFlags.Public | BindingFlags.Instance);
                if (pi != null && pi.CanWrite)
                {
                    if ((bool) pi.GetValue(item) == true)
                    {
                        selectedItems.Add(item);
                    }
                    else
                    {
                        selectedItems.Remove(item);
                    }
                }
            }
            catch (InvalidOperationException ex)
            {

            }
        }

        protected override void ClearContainer()
        {
            var item = this.DataContext;
            PropertyChangedEventManager.RemoveListener(item as INotifyPropertyChanged, this, "IsSelected");

            var selectedItems = DataGridControl.GetDataGridContext(this).SelectedItems.Remove(item);

            base.ClearContainer();
        }

        bool IWeakEventListener.ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
        {
            if (managerType == typeof(PropertyChangedEventManager))
            {
                this.UpdateSelectedItems(sender);
            }

            return true;
        }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

WPF에서 MVVM 디자인 패턴을 사용하여 프로그래밍 방식으로 DataGrid 행을 선택하고 포커스를 설정하는 방법

분류에서Dev

wpf mvvm에 저장 한 후 listview에서 선택한 행을 자동으로 업데이트하는 방법

분류에서Dev

MVVM을 사용하여 DataGrid에서 선택한 항목에 대한 정보를 전달하는 방법

분류에서Dev

스타일이 지정된 셀로 DataGrid에서 선택한 행을 강조 표시하는 방법 변경

분류에서Dev

Razor DropDownListFor SelectList, inumberable 선택 항목을 바인딩하는 방법 또는이를 수행하는 방법?

분류에서Dev

Tabletools를 사용하여 Datatables에서 선택한 행 데이터를 javascript jsonObject로 가져 오는 방법

분류에서Dev

jqgrid의 행 데이터로 행 ID를 얻는 방법 (선택한 행이 아님)

분류에서Dev

MVVM / retrofit Architecture에서 DataBinding을 사용하여 RecyclerView 행에서 데이터를 설정하는 방법은 무엇입니까?

분류에서Dev

Datatables에서 선택한 행의 데이터를 추출하는 방법

분류에서Dev

Linux : 선택한 IP 주소에 바인딩하는 프로그램을 실행하는 편리한 방법이 있습니까?

분류에서Dev

combox에서 값을 선택한 후 데이터베이스에서 DataGridView를 바인딩하는 방법

분류에서Dev

MVVM의 ViewModel에서 데이터 그리드의 행을 선택하는 방법은 무엇입니까?

분류에서Dev

특정 열의 데이터 검색을 기반으로 Pandas Dataframe에서 행을 선택하는 방법

분류에서Dev

jquery 및 webservice를 사용하여 SQL에 의해 바인딩되는 html 테이블에서 선택한 행을 얻는 방법은 무엇입니까?

분류에서Dev

간단한 MVVM 구조로 작동하도록 데이터 바인딩을 얻는 방법

분류에서Dev

특정 데이터 행을 기반으로 한 데이터 테이블에서 다른 데이터 테이블로 특정 행을 복사하는 방법

분류에서Dev

WPF (MVVM)에서 DataGrid 열 너비를 바인딩하는 방법

분류에서Dev

'정리'데이터 프레임에서 선택한 지점 위의 N 행을 하위 집합으로 만드는 방법

분류에서Dev

ASP.NET Form DataGrid에서 선택한 행을 검색하는 방법

분류에서Dev

개미 디자인 테이블 선택한 행을 재설정하는 방법은 무엇입니까?

분류에서Dev

MultiDataTrigger를 통해 WPF DataGrid에서 선택한 행의 대체 배경색을 갖는 방법

분류에서Dev

WPF DataGrid : 행이 확인 된 항목을 반영하도록 개체를 바인딩하는 방법

분류에서Dev

이미지를 데이터베이스로 가져 와서 특정 행에 대한 테이블의 "tooltipText ()"로 설정하는 방법

분류에서Dev

WPF에서 데이터 바인딩을 설정하는 방법

분류에서Dev

캐리지 리턴으로 행에서 특정 행을 선택하는 방법

분류에서Dev

선언 및 설정 값으로 행을 업데이트하는 방법

분류에서Dev

선택한 모든 데이터 행에 대해 저장 프로 시저를 실행하는 방법이 있습니까?

분류에서Dev

데이터 목록으로 데이터 행을 선택하는 방법

분류에서Dev

AngularJS에서 선택한 행에 대한 데이터를 수집하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    WPF에서 MVVM 디자인 패턴을 사용하여 프로그래밍 방식으로 DataGrid 행을 선택하고 포커스를 설정하는 방법

  2. 2

    wpf mvvm에 저장 한 후 listview에서 선택한 행을 자동으로 업데이트하는 방법

  3. 3

    MVVM을 사용하여 DataGrid에서 선택한 항목에 대한 정보를 전달하는 방법

  4. 4

    스타일이 지정된 셀로 DataGrid에서 선택한 행을 강조 표시하는 방법 변경

  5. 5

    Razor DropDownListFor SelectList, inumberable 선택 항목을 바인딩하는 방법 또는이를 수행하는 방법?

  6. 6

    Tabletools를 사용하여 Datatables에서 선택한 행 데이터를 javascript jsonObject로 가져 오는 방법

  7. 7

    jqgrid의 행 데이터로 행 ID를 얻는 방법 (선택한 행이 아님)

  8. 8

    MVVM / retrofit Architecture에서 DataBinding을 사용하여 RecyclerView 행에서 데이터를 설정하는 방법은 무엇입니까?

  9. 9

    Datatables에서 선택한 행의 데이터를 추출하는 방법

  10. 10

    Linux : 선택한 IP 주소에 바인딩하는 프로그램을 실행하는 편리한 방법이 있습니까?

  11. 11

    combox에서 값을 선택한 후 데이터베이스에서 DataGridView를 바인딩하는 방법

  12. 12

    MVVM의 ViewModel에서 데이터 그리드의 행을 선택하는 방법은 무엇입니까?

  13. 13

    특정 열의 데이터 검색을 기반으로 Pandas Dataframe에서 행을 선택하는 방법

  14. 14

    jquery 및 webservice를 사용하여 SQL에 의해 바인딩되는 html 테이블에서 선택한 행을 얻는 방법은 무엇입니까?

  15. 15

    간단한 MVVM 구조로 작동하도록 데이터 바인딩을 얻는 방법

  16. 16

    특정 데이터 행을 기반으로 한 데이터 테이블에서 다른 데이터 테이블로 특정 행을 복사하는 방법

  17. 17

    WPF (MVVM)에서 DataGrid 열 너비를 바인딩하는 방법

  18. 18

    '정리'데이터 프레임에서 선택한 지점 위의 N 행을 하위 집합으로 만드는 방법

  19. 19

    ASP.NET Form DataGrid에서 선택한 행을 검색하는 방법

  20. 20

    개미 디자인 테이블 선택한 행을 재설정하는 방법은 무엇입니까?

  21. 21

    MultiDataTrigger를 통해 WPF DataGrid에서 선택한 행의 대체 배경색을 갖는 방법

  22. 22

    WPF DataGrid : 행이 확인 된 항목을 반영하도록 개체를 바인딩하는 방법

  23. 23

    이미지를 데이터베이스로 가져 와서 특정 행에 대한 테이블의 "tooltipText ()"로 설정하는 방법

  24. 24

    WPF에서 데이터 바인딩을 설정하는 방법

  25. 25

    캐리지 리턴으로 행에서 특정 행을 선택하는 방법

  26. 26

    선언 및 설정 값으로 행을 업데이트하는 방법

  27. 27

    선택한 모든 데이터 행에 대해 저장 프로 시저를 실행하는 방법이 있습니까?

  28. 28

    데이터 목록으로 데이터 행을 선택하는 방법

  29. 29

    AngularJS에서 선택한 행에 대한 데이터를 수집하는 방법은 무엇입니까?

뜨겁다태그

보관