Синхронизация DataGrid и DataForm в Silverlight 3 - PullRequest
3 голосов
/ 11 апреля 2010

Я уже пару дней бьюсь головой об стену, и пришло время обратиться за помощью.

У меня есть 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» (тип «xxxx.ViewModel.VehicleViewModel»). BindingExpression: Path = 'SelectedVehicle' DataItem = 'xxxx.ViewModel.MainViewModel' (HashCode = 31664161); Целевым элементом является '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 Ответ

2 голосов
/ 12 апреля 2010

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

...