几天来,我一直在用头撞墙,是时候寻求帮助了。
我在同一个 UserControl 上有一个 DataGrid 和 DataForm。我正在使用 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}" />
因此,当 DataGrid 上的 SelectedItem 发生更改时,它应该将该更改推送回 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'(名称='');目标属性是“SelectedItem”(类型“System.Object”).. System.MethodAccessException: xxxx.ViewModel.MainViewModel.set_SelectedVehicle(xxxx.ViewModel.VehicleViewModel)
听起来从 VehicleViewModel 转换为对象(或再次转换回来)时遇到问题,但我很困惑为什么会这样(或者即使我在这个假设的正确轨道上)。DataGrid 中的每一行/项目都应该是 VehicleViewModel(因为 ItemsSource 绑定到该类型的 ObservableCollection),因此当 SelectedItem 更改时,它应该处理 VehicleViewModel 的实例。
任何见解将不胜感激。