我在选择模式下将Xceed DataGridControl设置为“扩展”(多选)。
我正在使用MVVM。每行都绑定(bind)到我的类MyRowObject的实例。 MyRowObject具有 bool 属性“IsSelected”。我想将DataGridControl行的“IsSelected”属性(如果有,我找不到可读写的属性)绑定(bind)到MyRowObject.IsSelected。
有谁知道是否可以使用Xceed DataGridControl做到这一点以及如何做到这一点?如果没有直接绑定(bind)的可能,是否有人为此写过行为?
最佳答案
实际上,这不可能直接做到。直到现在(2016-04-25)的任何版本都是如此。
但是Xceed非常友善,可以为我提供完成相同行为的代码(请参见下文)。我稍微修改了他们的代码,以使其双向传播并防止出现Exception,但否则行为正是我想要的。请注意,它被硬编码到属性“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;
}
}
}
关于c# - Xceed DataGrid设置为:MultiSelect - How to bind selected row to its MVVM row data行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36771966/