【问题标题】:WPF Binding Error Datagrid Converter SelectedItemsWPF 绑定错误 Datagrid Converter SelectedItems
【发布时间】:2011-09-18 11:49:24
【问题描述】:

在将 datgrid 上的 SelectedItems 集合绑定到我的 ViewModel 中的通用列表时,我似乎遇到了绑定错误。

<DataGrid  ItemsSource="{Binding Path=ListOfObjects}" SelectionMode="Extended" SelectionUnit="FullRow" SelectedItems="{Binding Path=ListOfSelectedObjects}" IsEnabled="{Binding Path=IsDoingNothing}">

这是管道位...当我尝试从 DataGrid 中选择一个项目时,我得到的错误是在运行时引发的。它似乎与将“SelectedItem”对象转换为我定义的类型的默认值转换器有关。

我做了一些阅读,我认为我需要某种值转换器?但我对此有点陌生,如果有人可以参考一些可以帮助我的与数据网格的这个问题/管道/应用相关的示例,我会很高兴。

System.Windows.Data Error: 23 : Cannot convert 'Stored Data Backup' from type 'MyType' to type 'System.Collections.Generic.List`1[Entities.MyType]' for 'en-GB' culture with default conversions; consider using Converter property of Binding.     NotSupportedException:'System.NotSupportedException: CollectionConverter cannot convert from     Entities.MyType.
   at System.ComponentModel.TypeConverter.GetConvertFromException(Object value)
   at System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
   at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'
System.Windows.Data Error: 7 : ConvertBack cannot convert value 'Stored Data Backup' (type 'MyType'). BindingExpression:Path=SelectedExcludedMyType; DataItem='MyTypeManagerViewModel' (HashCode=20097682); target element is 'DataGrid' (Name=''); target property is 'SelectedItem' (type 'Object') NotSupportedException:'System.NotSupportedException: CollectionConverter cannot convert from Dytecna.V001.Entities.MyType.
   at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
   at MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture) 
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

编辑:(将标题编辑为)我为我想要的功能绑定到数据网格的错误属性。我已经编辑了上面的 XAML...我想绑定到 SelectedItems,它是复数,而不是 SelectedItem,所以我可以选择多行并将它们绑定到我的 ViewModel 中的列表...

我没有收到上述绑定错误,我只是收到一个:

    Error   1   'SelectedItems' property is read-only and cannot be set from markup.

那么我该如何绑定呢?

【问题讨论】:

    标签: wpf list datagrid binding converter


    【解决方案1】:

    我只想在@blindmeis 答案中添加一段有用的代码。

    当您使用@blindmeis 示例中的绑定时,您将获得 SelectedItems 作为对象。我需要一些时间才能找到如何将其转换为 IList。你在这里:

    private void DeleteCommand(object param) {
    System.Collections.IList itemsList = (System.Collections.IList)SelectedItems;
    var collection = items.Cast<item>();
    

    }

    【讨论】:

      【解决方案2】:

      ItemsSource="{Binding Path=ListOfObjects}"

      属于 Entities.MyType 类型,因此您必须在 vm 中绑定到该类型的属性。

      顺便说一句,您只能绑定到 SelectedItem 而不是 SelectedItems!

      您可以做的是使用 CommandParameters 传递 SelectedItems。

      <Button Command="{Binding DeleteCommand}" CommandParameter="{Binding ElementName=MyDataGrid, Path=SelectedItems}" />
      

      SelectedItems 是 IList 的类型!

      【讨论】:

      • 感谢blindmeis ...我刚刚在问题的代码中注意到了这一点!我让它与 SelectedItem 的绑定一起工作,我现在将功能扩展到 SelectedItems ......这就是我现在的问题所在。我已经编辑了问题并标记了您的答案,因为出于所有密集目的,您是对的,我错了!
      • 如果您不想使用 Command 解决方法,则 SelectedItems 和 Datagrid 周围有一些 AttachedPropeties。例如:blogs.msdn.com/b/keithjones/archive/2009/10/02/…
      • 漂亮的代码......没有错误,它调用了gets......所以我想它肯定没问题。现在只需要二传手工作。看起来需要一些时间来了解这个类。我想这比按食谱做要好。您所说的命令解决方法是什么?我是一个渴望学习的人!
      • 我为一个简单的 ICommand(RelayCommand 或 DelegateCommand)发布了 xaml。所选项目没有绑定到虚拟机,而是使用命令参数传递给它。当然,这只是单向工作;)所以我无法在我的虚拟机中选择项目。
      • 我想我明白了,如果我将 selectionchanged 事件的命令与传回 VM 的 SelectedItems 连接起来,我可以通过这种方式更新它......我会试一试,然后更新我的问题结果。我不知道如何让 AttachedProperties 方法的设置器运行,而且我更熟悉命令。并不是说我不会在空闲时间研究另一种方法!
      【解决方案3】:

      ListOfObjects 中的对象应该有一些 IsSelected 属性; AFAIK 你不能绑定到 SelectedItems。

      然后您可以将 IsSelected 属性绑定到 DataGridRow 的 IsSelected 属性:

      <DataGrid.Resources>
          <Style TargetType="DataGridRow">
              <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
      

      【讨论】:

      • 感谢您的提示...我注意到我在代码中从所需功能中犯了一个小错误(编写有问题的 SO 是一个很好的调试练习)并且更改已经新错误!我已根据此编辑了上述问题。
      猜你喜欢
      • 2015-07-25
      • 2011-09-17
      • 2016-07-16
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 2015-07-02
      • 2016-09-22
      相关资源
      最近更新 更多