我已经为此苦苦思索了几天,是时候寻求帮助了。
我在同一个 UserControl 上有 DataGrid 和 DataForm。我使用的是 MVVM 方法,因此用户控件只有一个 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 的 setter ,并且在 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 绑定(bind)到该类型的 ObservableCollection),所以当 SelectedItem 发生变化时,它应该处理 VehicleViewModel 的一个实例。
如有任何见解,我们将不胜感激。
最佳答案
您在 public VehicleViewModel SelectedVehicle
上的 setter 是私有(private)的,因此 DataGrid 无法使用 TwoWay 模式修改它。您的二传手需要公开。
关于silverlight - 在 Silverlight 3 中同步 DataGrid 和 DataForm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2617714/