سؤال

لقد أنشأت 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));
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top