WPF Binding Error Datagrid Converter SelectedItems - PullRequest
2 голосов
/ 20 июня 2011

Кажется, я получаю ошибку привязки с привязкой коллекции 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.

Так как мне привязать ее?

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

ItemsSource = "{Binding Path = ListOfObjects}"

имеет тип Entities.MyType, поэтому вам необходимо привязать свойство этого типа в вашей виртуальной машине.

Кстати, вы можете просто привязать SelectedItem, а не SelectedItems!

Что вы можете сделать, это передать SelectedItems с помощью CommandParameters.

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

SelectedItems - это тип IList!

0 голосов
/ 26 февраля 2013

Я просто хочу добавить часть полезного кода в ответ @blindmeis.

Когда вы используете привязку из примера @blindmeis, вы получите SelectedItems в качестве объекта.Мне понадобится некоторое время, чтобы найти, как это сделать в IList.Вот вы:

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

}

0 голосов
/ 20 июня 2011

Объекты в ListOfObjects должны вместо этого иметь некоторое свойство IsSelected; AFAIK, вы не можете привязать к SelectedItems.

Затем можно привязать свойство IsSelected к свойству IsSelected объекта DataGridRow:

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