سؤال

لقد كنت أضرب رأسي على الحائط لبضعة أيام في هذا الأمر ، وقد حان الوقت لطلب المساعدة.

لقد حصلت على DataGrid و DataForm على نفس UserControl. أنا أستخدم نهج MVVM ، لذا يوجد عرض واحد لـ UserControl. يحتوي 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}" />

لذا ، نظرًا لتغييرات SelectItem على بيانات البيانات ، يجب أن تضغط على هذا التغيير مرة أخرى إلى ViewModel وعندما يرفع ViewModel the OnpropertyChanged ، يجب على DataForm تحديث نفسه مع المعلومات الخاصة بـ MoreViewModel المحددة حديثًا. ومع ذلك ، لا يتم استدعاء Setter for Selectivehicle وفي نافذة الإخراج VS ، أرى الخطأ التالي:

System.windows.data خطأ: لا يمكن تحويل القيمة "xxxx.viewmodel.vehicleviewmodel" (اكتب "xxxx.viewmodel.vehicleviewmodel '). bindingexpression: path = 'selectvehicle' dataitem = 'xxxx.viewmodel.mainviewmodel' (hashcode = 31664161) ؛ العنصر الهدف هو "system.windows.controls.datagrid" (name = '') ؛ الخاصية الهدف هي "selectItem" (اكتب "system.object") .. System.MethodAccessException:

يبدو أنه يواجه مشكلة في التحويل من مركبة ViewModel إلى كائن (أو العودة مرة أخرى) ، لكنني في حيرة من أمري بشأن سبب ذلك (أو حتى لو كنت على المسار الصحيح مع هذا الافتراض). يجب أن يكون كل صف/عنصر في بيانات DataGrid عبارة عن مركبة ViewModel (لأن العناصر المرتبطة بملاحظة من هذا النوع) ، لذلك عندما يتغير SelectItem ، يجب أن يتعامل مع مثيل من MotionViewModel.

أي رؤية سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

الخاص بك على public VehicleViewModel SelectedVehicle هو خاص بحيث لا يمكن لخطوط البيانات تعديله باستخدام وضع Twoway. سوف تحتاج إلى أن يكون Setter الخاص بك للجمهور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top