Я уже пару дней бьюсь головой об стену, и пришло время обратиться за помощью.
У меня есть DataGrid и DataForm в одном UserControl. Я использую подход MVVM, поэтому для UserControl существует одна ViewModel. Эта ViewModel имеет несколько свойств, которые имеют отношение к этому обсуждению:
public ObservableCollection<VehicleViewModel> Vehicles { get; private set; }
public VehicleViewModel SelectedVehicle
{
get { return selectedVehicle; }
private set
{
selectedVehicle = value;
OnPropertyChanged( "SelectedVehicle" );
}
}
В XAML я определил DataGrid и DataForm следующим образом:
<data:DataGrid SelectionMode="Single"
ItemsSource="{Binding Vehicles}"
SelectedItem="{Binding SelectedVehicle, Mode=TwoWay}"
AutoGenerateColumns="False"
IsReadOnly="True">
<dataFormToolkit:DataForm CurrentItem="{Binding SelectedVehicle}" />
Таким образом, поскольку SelectedItem изменяется в DataGrid, он должен перенести это изменение обратно в ViewModel, и когда ViewModel вызывает OnPropertyChanged, DataForm должна обновить себя информацией для вновь выбранного VehicleViewModel. Тем не менее, сеттер для SelectedVehicle никогда не вызывается и в окне вывода VS я вижу следующую ошибку:
System.Windows.Data Ошибка: ConvertBack не может преобразовать значение «xxxx.ViewModel.VehicleViewModel» (тип «xxxx.ViewModel.VehicleViewModel»). BindingExpression: Path = 'SelectedVehicle' DataItem = 'xxxx.ViewModel.MainViewModel' (HashCode = 31664161); Целевым элементом является 'System.Windows.Controls.DataGrid' (Name = ''); Свойство target - SelectedItem (тип System.Object) .. System.MethodAccessException: xxxx.ViewModel.MainViewModel.set_SelectedVehicle (xxxx.ViewModel.VehicleViewModel)
Звучит так, как будто у него возникли проблемы с преобразованием из VehicleViewModel в объект (или обратно), но я не совсем понимаю, почему это так (или даже если я на правильном пути с этим предположением). Каждая строка / элемент в DataGrid должна быть VehicleViewModel (потому что ItemsSource связан с ObservableCollection этого типа), поэтому при изменении SelectedItem он должен иметь дело с экземпляром VehicleViewModel.
Любое понимание будет оценено.