3

几天来,我一直在用头撞墙,是时候寻求帮助了。

我在同一个 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 的实例。

任何见解将不胜感激。

4

1 回答 1

2

您的 setterpublic VehicleViewModel SelectedVehicle是私有的,因此 DataGrid 无法使用 TwoWay 模式对其进行修改。您的二传手需要公开。

于 2010-04-12T04:49:28.403 回答