2016-04-21 1 views
1

Я использую Xceed DataGridControl в режиме выбора, установленном в «Extended» (multi selection).Xceed DataGrid установлен в строку: MultiSelect - как привязать выбранную строку к ее данным строки MVVM

Я использую MVVM. Каждая строка привязана к экземпляру моего класса MyRowObject. MyRowObject имеет логическое свойство «IsSelected». Я хочу привязать строку DataGridControl «IsSelected» (если она есть, я не могу найти тот, который читается/записывается) в MyRowObject.IsSelected.

Кто-нибудь знает, можно ли это сделать с помощью Xceed DataGridControl и как это сделать? Если нет прямого связывания, может ли кто-нибудь написать для этого поведение?

+0

Пожалуйста, проверьте этот пост поможет вам http://stackoverflow.com/questions/1631543/how-do-i-detect-row-selection-in-the-xceed-datagrid-for-wpf – user1386121

+0

Спасибо, Ссылка о единичном выборе. он отлично работает для одного выбора. Проблема, которую я имею, - это множественный выбор, для которого вы должны привязываться к каждой строке, а IsSelected может быть прочитан только, для этого свойства нет (это я знаю). –

ответ

0

Фактически это невозможно сделать напрямую. Это верно для любой версии до настоящего времени (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; 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^