我一直在靠墙撞墙几天,是时候寻求帮助了。
我在同一个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}" />
因此,当SelectedItem在DataGrid上发生更改时,它应该将该更改推送回ViewModel,并且当ViewModel引发OnPropertyChanged时,DataForm应该使用新选择的VehicleViewModel的信息刷新自身。但是,从不调用SelectedVehicle的setter,在VS的Output窗口中我看到以下错误:
System.Windows.Data错误:ConvertBack无法转换值'xxxx.ViewModel.VehicleViewModel'(类型'xxxx.ViewModel.VehicleViewModel')。 BindingExpression:Path ='SelectedVehicle'DataItem ='xxxx.ViewModel.MainViewModel'(HashCode = 31664161); target元素是'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的实例。
任何见解都将受到赞赏。
答案 0 :(得分:2)
public VehicleViewModel SelectedVehicle
上的setter是私有的,因此DataGrid无法使用TwoWay模式对其进行修改。你的二传手需要公开。