在Silverlight 3中同步DataGrid和DataForm

时间:2010-04-11 16:23:59

标签: silverlight datagrid dataform

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

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

任何见解都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

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