2017-02-16 7 views
0

У меня есть DataGrid с четырьмя колоннами:Datagrid ошибка - Viemodel свойство не может быть заселена

enter image description here

Datagrid заполняется с помощью наблюдаемой коллекции. Вид модели:

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"); 
    } 
} 

Вот требование для меня: - Column C и Column D должны иметь одинаковые значения, если пользователь не вносит изменения в Column A или Column B. В этом случае Column D должен стать ColumnA+ColumnB.

На основании приведенного выше условия, я могу внести изменения в модели представления, как

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;} 
    } 
  • вопрос, который я лицо, что я не в состоянии заполнить columnD с «initial values = values same as columnC». Как предоставить начальные значения столбцу D?

  • Когда я пытаюсь сделать это с помощью коллекции, я получаю сообщение об ошибке, как:

property D cannot be assigned to -- it is read only

ответ

1

Добавить сеттер в D собственности и установите его значение в инкубаторе из A и 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; } 
} 
+0

thnks. Вариант проблемы: можно ли вызвать функцию, когда А или В меняются, что-то делает? @ mm8 – user7157732

+0

Вы можете вызвать любой метод, который вы хотите, в настройках свойств A и B так же, как вы вызываете метод NotifyPropertyChanged. – mm8

1

You может использовать другое поле для хранения, было ли изменено значение A или B.

private bool hasAorBChanged = false; 

Это поле может быть установлен истинный раз A или 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;} 
} 

Тогда свойство D может выглядеть

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

не чистейшим решением, но, учитывая, что D предназначен для чтения, это должно работать.

Редактировать: Вы также можете переместить hasAorBChanged = true; на способ NotifyPropertyChanged(). Это сделало бы его чище.