ObservableCollection не обновляется в DataGrid WPF

121
01 января 2020, 18:50

Споткнулся на обновлении DataGrid при добавлении элемента в ObservableCollection. Есть некий класс Material:

 public class Material : INotifyPropertyChanged
  {  
     public string Type
     {
        get { return type; }
        set { type = value; OnPropertyChanged("Type"); 
     }
   }
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
}

В VM создаю экземпляр класса и несколько методов для работы с ним.

public class Window_с : INotifyPropertyChanged
 {
    ObservableCollection<Material> furniture;
    public ObservableCollection<Material> Furniture
    {
        get { return furniture; }
        set {
            furniture = value;
            OnPropertyChanged("Furniture");
        }
    }
    public Window_с()
    {
     furniture = new ObservableCollection<Material>();
    }
      public void SetFurniture()
     {               
                Material tmp = new Material();                     
                Furniture.Add(tmp);
     }
       public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
}

В XAML делаю привязку:

<Grid>
       <DataGrid Name="CalculateGrid" ItemsSource="{Binding 
Window_Client.Furniture, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"   />
</Grid>

В приложении есть кнопка, при нажатии на которую открывается CalculateWindow с CalculateGrid, но при добавлении или изменении коллекции, Grid обновляется только при повторном открытии CalculateWindow. При попытке изменить коллекцию, состояние так же не сохраняется. При отладке, программа даже не пытается попасть в

    set {
            furniture = value;
            OnPropertyChanged("Furniture");
        }

upd:

В программе есть главное окно, в котором задаются размеры:

 public MainWindow()
    {
        InitializeComponent();
        DataContext = new VM();
    }
private void calculateButton_Click(object sender, RoutedEventArgs e)
        {
                CalculateWindow f = new CalculateWindow ();
                f.DataContext = DataContext;
                f.Show();          
        }

и окно с расчетом.

  public partial class CalculateWindow : Window
    {
        public CalculateWindow()
        {
            InitializeComponent();              
        }
    }

В VM()

class VM : INotifyPropertyChanged
    {
        public RelayCommand CalculateWindow => new RelayCommand(o =>
        {
            Window_Client = new Window_с();
            CalculateWindows();
        });
        Window_с window;
        public Window_с Window_Client
        {
            get { return window; }
            set { window = value; OnPropertyChanged("window"); }
        }
        public void CalculateWindows()
        {
            Window_Client.SetFurniture(pList);
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }
    }
}
Answer 1

У вас неверно настроены нотификации об изменении свойства Window_Client

    public Window_с Window_Client
    {
        get { return window; }
        set { window = value; OnPropertyChanged("window"); }
    }

В метод OnPropertyChanged необходимо передавать название публичного свойства, а вы передаете название приватного поля. Должно быть вот так:

    public Window_с Window_Client
    {
        get { return window; }
        set { window = value; OnPropertyChanged(nameof(Window_Client)); }
    }
READ ALSO
Наследование от модели без записи в БД EF6

Наследование от модели без записи в БД EF6

Заполняю datagridview вот так:

131
Установить высоту элементов ListBox равную самому высокому элементу

Установить высоту элементов ListBox равную самому высокому элементу

В списке находятся превьюшки с подписямиПодписи должны выравниваться по нижнему, а превьюшки по верхнему краю своего контейнера

99
PHP, МуSql - как объединить несколько запросов в один?

PHP, МуSql - как объединить несколько запросов в один?

Есть несколько запросов, к базе данныхСуммарно по времени они выполняются более 10 секунд

131
Как в Yii2 добавить атрибут к модели?

Как в Yii2 добавить атрибут к модели?

У меня есть вот такой вот html код, в котором есть vue атрибуты

144