"확장"(다중 선택)으로 설정된 선택 모드에서 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] 삭제
몇 마디 만하겠습니다