سؤال

يحتوي النموذج الخاص بي حاليًا على عشر خصائص سأذكرها هنا لأغراضنا AnnualizedRate1, AnnualizedRate2, ..., AnnualizedRate10 والتي يتم الكشف عنها للمشاهدات في نموذج العرض عبر عشر خصائص Rate1, Rate2, ..., Rate10.إحدى وجهات نظري تظهر هذه القيم في ملف DataGrid.هذا أمر متكرر للغاية ويشكل ألمًا للتكيف مع المتطلبات المتغيرة.يجب أن تكون هناك طريقة أفضل من التالية.

نموذج (MyModel):

public decimal AnnualizedRate1 { get { return this.AnnualizedRate(1); } }
public decimal AnnualizedRate2 { get { return this.AnnualizedRate(2); } }
...
public decimal AnnualizedRate10 { get { return this.AnnualizedRate(10); } }

أين MyModel.AnnualizedRate يكون

public decimal AnnualizedRate(int i);

عرض النموذج (MyViewModel):

public decimal Rate1 { get { return myModel.AnnualizedRate1; } }
public decimal Rate2 { get { return myModel.AnnualizedRate2; } }
...
public decimal Rate10 { get { return myModel.AnnualizedRate10; } }

منظر (MyView):

xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
...
    <dg:DataGrid>
        <dg:DataGrid.Columns>
            <dg:DataGridTextColumn
                Header="Rate1" 
                Binding="{Binding Rate1, StringFormat=P}"
                IsReadOnly="True"/>
            <dg:DataGridTextColumn
                Header="Rate2" 
                Binding="{Binding Rate2, StringFormat=P}"
                IsReadOnly="True"/>
            ...
            <dg:DataGridTextColumn
                Header="Rate10" 
                Binding="{Binding Rate10, StringFormat=P}"
                IsReadOnly="True"/>
        </dg:DataGrid.Columns>
    </dg:DataGrid>

هل لدى أي شخص أي أفكار؟

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

المحلول

وأود أن استخدام وObservableCollection لتخزين البيانات وربط الشبكة ل.

نصائح أخرى

إليك الكود للقيام بما قاله RB Davidson للقيام به.عندما تجد أن هذا يفعل ما تريد، يرجى منحه الفضل.إجابته صحيحة.

في نموذج العرض الخاص بك:

public class AnnualizedRateViewModel
{
     public string Name { get; set; }
     public decimal Rate { get; set; }
}

public MyViewModel : INotifyPropertyChanged
{

public MyViewModel()
{
     AnnualizedRates = new ObservableCollection<AnnualizedRateViewModel>();
     //I'd recommend your model having a GetAllRates() function rather than this,
     //but for demo purposes, this works
     for(int i = 1; i <= 10; i++)
     {
          AnnualizedRates.Add(new AnnualizedRateViewModel()
          {
               Name = string.Format("Rate {0}", i),
               Rate = MyModel.AnnualizedRate(i)
          });
     }
}

private ObservableCollection<int> _annualizedRates;
public ObservableCollection<int> AnnualizedRates
{
     get { return _annualizedRates; }
     set
     {
          _annualizedRates = value;
          //Raise OnNotifyPropertyChanged event from your
          //implementation of INotifyPropertyChanged in your viewmodel
          //the full implementation of this is outside the scope of this demo
     }
}

}

ومن هناك يمكنك بالفعل استخدام ربط البيانات لإنشاء الأعمدة في طريقة العرض الخاصة بك.يمكنك الارتباط بهذه المجموعة من الأسعار السنوية.نظرًا لأن مجموعة أدوات WPF لا تجعل هذا الأمر سهلاً، فسيتعين عليك كتابة محول قيمة لتحويل ObservableCollection<AnnualizedRateViewModel> إلى ObservableCollection<DataGridColumn>.

<dg:DataGrid AutoGenerateColumns="false" Columns="{Binding AnnualizedRates, ValueConverter={StaticResource AnnualizedRatesToDataGridColumnCollectionConverter}}">
</dg:DataGrid>

الشيء الذي يجب أن تتعلمه هنا هو أنه عندما تفكر في نفسك "التكرار"، حاول أن تفكر بدلاً من ذلك في "التجميع".

حظ سعيد...ومرة أخرى، الائتمان آر بي ديفيدسون.

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