ObjectDataprovider في MVVM غير ضروري؟
-
01-10-2019 - |
سؤال
لقد أنشأت MVVM بسيط ، مع ثلاث فئات فقط CashFlowView و CashFlowViewModel و CashFlowModel.
يمكنني استخدام infragistic's 9.1 XamdatapResEnter (أو xamdatagrid).
<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Source={StaticResource CashFlowData}}">
<ObjectDataProvider x:Key="CashFlowData" ObjectType="{x:Type ViewModel:CashflowViewModel}" MethodName="GetCashFlows" />
داخل ViewModel الخاص بي:
public ObservableCollection<CashflowModel> GetCashFlows()
{
return new ObservableCollection<CashflowModel>() { ... };
}
ViewModel متصل بالعرض من خلال هذا:
this.DataContext = new CashflowViewModel();
طالما أقوم بتوصيل الشبكة بـ ObjectDataprovider ، فإنها تعمل بشكل جيد تمامًا. لكنني تمنيت أن أتمكن فقط من الاتصال بخاصية داخل ViewModel بدلاً من ذلك.
وفقًا لـ Infragistics ، كل ما علي فعله هو:
<igDP:XamDataGrid DataSource="{Binding Path=ViewModelCollection}"/>
ولكن في هذه الحالة ، يبدو أنني بحاجة إلى ربط مجموعة من عوامل ViewModel الأخرى لتمثيل صفوقي داخل الشبكة. وهذا هو المكان الذي أشعر فيه بالارتباك.
جربت هذا ولا يعمل:
<igDP:XamDataPresenter Name="xamDataPresenter1" DataSource="{Binding Path=CashFlows}">
داخل ViewModel:
public ObservableCollection<CashflowDataGridViewModel> CashFlows
{
get
{
return new ObservableCollection<CashflowDataGridViewModel>();
}
}
ولكن كيف أقوم بإنشاء ViewModel الثاني (CashFlowDataGridViewModel)؟
حاولت إضافة هذا proprty ضمن هذا العرض الثاني:
public CashflowModel CashFlow
{
get
{
return new CashflowModel() {...};
}
}
لكن كل ما أظهرته في رأيي هو رأس عمود "التدفق النقدي" دون أي من الرؤوس الأساسية لفئة الأزياء النقدية الفعلية.
المحلول
لتكون قادرًا على ربط العرض بالخصائص الموجودة على ViewModel ، يجب تعيين DataContext على مثيل في ViewModel. ما أفعله عادة هو تضمين السطر التالي في مُنشئ الكود-لوجود رأيي:
this.DataContext = new SomeAwesomeViewModel();
يمكنك أيضًا تعيين DataContext للحاويات إذا كنت تريد مجموعات مختلفة من عناصر التحكم لاستخدام ViewModels مختلفة (على سبيل المثال ، Grid.Datacontext ، StackPanel.Datacontext ، إلخ).
بمجرد الحصول على مجموعة DataContext ، يجب أن تكون قادرًا على ربط خصائص ViewModel هذه.
تحديث
إليك القليل من رمز النماذج لجعلك تذهب.
public class CashFlowViewModel
{
public ObservableCollection<FlowViewModel> DataGridData
{
get...
}
}
هذه هي الخاصية التي يجب أن توفر البيانات الخاصة بمخطط البيانات. الآن ، هذا ما FlowViewModel
يمكن أن يبدو الفصل.
public class FlowViewModel
{
decimal flowAmount;
public decimal FlowAmount
{
get { return flowAmount; }
set
{
if(flowAmount == value)
return;
flowAmount = value;
NotifyPropertyChanged("FlowAmount");
}
}
.
.
.
private void NotifyPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}