2010-04-11 1 views
3

Я уже несколько дней стучу головой о стену, и пришло время обратиться за помощью.Синхронизация DataGrid и DataForm в Silverlight 3

У меня есть DataGrid и DataForm на одном UserControl. Я использую подход 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 никогда не вызывается и в окне вывода VS я вижу следующую ошибку:

Ошибка System.Windows.Data: ConvertBack не может преобразовать значение 'xxxx.ViewModel.VehicleViewModel' (type ' xxxx.ViewModel.VehicleViewModel '). BindingExpression: Path = 'SelectedVehicle' DataItem = 'xxxx.ViewModel.MainViewModel' (HashCode = 31664161); целевой элемент - «System.Windows.Controls.DataGrid» (Name = ''); предназначаться свойством является «SelectedItem» (типа «System.Object») .. System.MethodAccessException: xxxx.ViewModel.MainViewModel.set_SelectedVehicle (xxxx.ViewModel.VehicleViewModel)

Это звучит, как это иметь проблему преобразования из VehicleViewModel в объект (или обратно), но я смущен, почему это было бы (или даже если я на правильном пути с этим допущением). Каждая строка/элемент в DataGrid должна быть VehicleViewModel (поскольку ItemsSource привязан к ObservableCollection этого типа), поэтому, когда SelectedItem изменяется, он должен иметь дело с экземпляром VehicleViewModel.

Любое понимание будет оценено по достоинству.

ответ

2

Ваш сеттер на public VehicleViewModel SelectedVehicle является конфиденциальным, поэтому DataGrid не может его изменить, используя режим TwoWay. Ваш сеттер должен быть общедоступным.

+0

Ну, это неловко. Как это для случая отсутствия леса для деревьев. Я был настолько сосредоточен на том, что исключение пыталось сказать мне, что я совершенно не замечал этого. Исправлена ​​проблема с удалением «частного» из сеттера. Благодаря! –