Mam datagrid z czterema kolumnami:

enter image description here

DataGrid jest wypełniony przez obserwowalną kolekcję. Zobacz model to:

public class PlanningResult : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public double A { get; set; }
    public double B { get; set; }
    public double C { get; set; }
    public double D { get; set; }
}

ObservableCollection<PlanningResult> populatePatternData = new ObservableCollection<PlanningResult>();
public ObservableCollection<PlanningResult> PopulatePatternData
{
    get { return populatePatternData; }
    set
    {
        populatePatternData = value;
        base.OnPropertyChanged("StringList");
    }
}

Oto wymóg dla mnie: - Column C i Column D powinien mieć takie same wartości, chyba że użytkownik dokonuje zmiany Column A lub Column B. W takim przypadku Column D powinien stać się ColumnA+ColumnB.

Na podstawie powyższego stanu mogę wprowadzić zmiany w modelu widoku jako

public class PlanningResult : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private double _a;
    public double A
    {
        get { return _a; }
        set { _a = value; NotifyPropertyChanged(); NotifyPropertyChanged("D"); }
    }

    private double _b;
    public double B
    {
        get { return _b; }
        set { _b = value; NotifyPropertyChanged(); NotifyPropertyChanged("D"); }
    }

    public double D { get { return _a + _b; } }

public double C {get;set;}
    }
  • Problem, z którym mam twarz, jest to, że nie mogę wypełnić kolumny z "{x0}}". Jak dostarczę początkowe wartości do kolumny D?

  • Kiedy próbuję to zrobić za pomocą kolekcji, otrzymuję błąd jako:

{x0}}

0
user7157732 16 luty 2017, 13:59

2 odpowiedzi

Najlepsza odpowiedź

Dodaj setter do właściwości D i ustaw swoją wartość w setterie A i B}:

public class PlanningResult : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private double _a;
    public double A
    {
        get { return _a; }
        set { _a = value; NotifyPropertyChanged(); D = _a + _b; }
    }

    private double _b;
    public double B
    {
        get { return _b; }
        set { _b = value; NotifyPropertyChanged(); D = _a + _b; }
    }

    private double _d;
    public double D
    {
        get { return _d; }
        set { _d = value; NotifyPropertyChanged(); }
    }

    public double C { get; set; }
}
1
mm8 16 luty 2017, 11:04

Możesz użyć innego pola do przechowywania, czy A lub B został zmieniony.

private bool hasAorBChanged = false;

To pole można ustawić na true po zmianie A lub B.

private double _a;
public double A
{
    get { return _a; }
    set { _a = value; NotifyPropertyChanged(); NotifyPropertyChanged("D"); 
    hasAorBChanged = true;}
}

private double _b;
public double B
{
    get { return _b; }
    set { _b = value; NotifyPropertyChanged(); NotifyPropertyChanged("D"); 
    hasAorBChanged = true;}
}

Potem będzie wyglądać

public double D { get { return hasAorBChanged ? _a + _b : C; } }

Nie najczystsze rozwiązanie, ale biorąc pod uwagę, że d ma być tylko do odczytu, powinno to działać.

Edytuj: Możesz także przesunąć hasAorBChanged = true; do metody NotifyPropertyChanged(). Uczyniłoby to trochę czystsze.

1
bit 16 luty 2017, 11:12