【问题标题】:How do I bind selectedItem property of WPFToolkit-Datagrid to my viewmodel property?如何将 WPFToolkit-Datagrid 的 selectedItem 属性绑定到我的 viewmodel 属性?
【发布时间】:2010-05-26 10:17:14
【问题描述】:

我有一个 WPFToolkit-datagrid 和一个带有属性的视图模型类 - “SelectedGridItems” 如何将 WPFToolkit-Datagrid 的 selectedItem 属性绑定到我的 viewmodel 属性(“SelectedGridItems”)?

【问题讨论】:

  • 考虑到您编写了 SelectedGridItems(复数),我假设您想在 DataGrid 中绑定多个项目的选择?如果您只想绑定网格的选定(单)行,这很容易 - 如果您想选择多行,那就更复杂了。
  • 我需要绑定多个项目。但是你能告诉我单品怎么做吗?我的实际要求是:stackoverflow.com/questions/2910873/…。单击按钮时,我想将所选项目作为参数传递。由于我没有得到这个问题的任何答案,我想我应该将所选项目设置为视图模型属性

标签: wpf datagrid viewmodel selecteditem


【解决方案1】:

这是一个附加属性,它与 ListBox 的 SelectionChanged 事件挂钩,并将所选项目的列表填充到 ViewModel。您可以简单地将“ListBox”更改为“DataGrid”。

http://marlongrech.wordpress.com/2009/06/02/sync-multi-select-listbox-with-viewmodel/

编辑:为 DataGrid 版本添加源代码...

/// <summary>
/// Attached property that stores the selected items of a DataGrid
/// </summary>
public static class DataGridService
{
   #region SelectedItems

   /// <summary>
   /// SelectedItems Attached Dependency Property
   /// </summary>
   public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
       "SelectedItems", 
       typeof(IList), 
       typeof(DataGridService),
       new FrameworkPropertyMetadata((IList)null, new PropertyChangedCallback(OnSelectedItemsChanged)));

   /// <summary>
   /// Gets the SelectedItems property.
   /// </summary>
   /// <param name="d"><see cref="DependencyObject"/> to get the property from</param>
   /// <returns>The value of the SelectedItems property</returns>
   public static IList GetSelectedItems(DependencyObject d)
   {
      return (IList)d.GetValue(SelectedItemsProperty);
   }

   /// <summary>
   /// Sets the SelectedItems property.
   /// </summary>
   /// <param name="d"><see cref="DependencyObject"/> to set the property on</param>
   /// <param name="value">value of the property</param>
   public static void SetSelectedItems(DependencyObject d, IList value)
   {
      d.SetValue(SelectedItemsProperty, value);
   }

   /// <summary>
   /// Handles changes to the SelectedItems property.
   /// </summary>
   /// <param name="d"><see cref="DependencyObject"/> that fired the event</param>
   /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param>
   private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {
      var grid = (DataGrid)d;
      ReSetSelectedItems(grid);
      grid.SelectionChanged += delegate
      {
         ReSetSelectedItems(grid);
      };
   }

   /// <summary>
   /// Sets the selected items collection for the specified <see cref="DataGrid"/>
   /// </summary>
   /// <param name="grid"><see cref="DataGrid"/> to use for setting the selected items</param>
   private static void ReSetSelectedItems(DataGrid grid)
   {
      IList selectedItems = GetSelectedItems(grid);
      selectedItems.Clear();
      if (grid.SelectedItems != null)
      {
         foreach (var item in grid.SelectedItems)
         {
            selectedItems.Add(item);
         }
      }
   }

   #endregion
}

在 XAML 中:

<tk:DataGrid ... local:DataGridService.SelectedItems="{Binding Path=MyCollection}" SelectionMode="Extended">

“MyCollection”应该是 ViewModel 中的 ObservableCollection。

【讨论】:

  • 嗨,这是一个非常有用的链接...但我遇到的一个问题是 DataGrid 没有名为“selectedItems”的属性...它只有一个属性“selecteditem”。我们可以做一些链接附加属性来克服同样的问题吗?如果是这样我可以在 mvvm 模型中使用它吗...我的意思是视图模型中的附加属性?
  • DataGrid 确实有一个 SelectedItems 属性:msdn.microsoft.com/en-us/library/… 我已经更新了我的答案,将源代码包含在属性的 DataGrid 版本中。
  • 我已经检查过了……但问题是“OnSelectedItemsChanged”没有被调用。 :(
  • 嗨,Thankkksssssssss 很多......我已经实现了......非常感谢......
  • 没问题。 “OnSelectedItemsChanged 没有被调用”的问题可能只是一个令人困惑的方法名称的情况。当 DataGrid 选择更改时,不会调用该方法,而是在 SelectedItems 附加属性更改时调用该方法。当 DataGridSelection 更改时,应调用 ReSetSelectedItems。
【解决方案2】:

这是 WPF4 的 DataGrid 的代码,我目前无法访问 Toolkit,但我怀疑它是否有所不同。

用于绑定数据网格中的单行:

<DataGrid ItemsSource="{Binding ViewModelCollectionProperty}"
SelectedItem="{Binding Path=ViewModelProperty}">

</DataGrid>

要绑定多个选定的行,最好的办法可能是创建一个附加属性,该属性维护一组选定项,然后可以将数据绑定到视图模型。

编辑 -- 在下方添加链接

有关创建附加属性的文章与您想要的非常相似,请参见此处: http://alexshed.spaces.live.com/Blog/cns!71C72270309CE838!149.entry

【讨论】:

  • 我遵循 MVVM 模式...所以无法在视图代码隐藏文件中写入任何内容。你能告诉我 1. 我可以将属性附加到 WPFToolkit 控件吗? 2. 我可以在 XAMl 中附加属性吗(不在代码隐藏中使用 RergisterAttached)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2017-11-01
  • 1970-01-01
  • 2022-07-09
相关资源
最近更新 更多