2016-05-12 2 views
-1

загружает DataGrid и заполняющий DataGrid ряд 1'OnPropertyChanged обыкновение изменения при использовании WTH наблюдаемой коллекции и одно свойство

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 

     InitializeComponent(); 
     update(); 
     //this.DataContext = this; 



    } 
    CricketEvent events = new CricketEvent(); 

    private void update() 
    { 
     events.updateList(new CricketEvent[1] { new CricketEvent(){Runs="1"} }); 
     DG1.ItemsSource = events.RunsList; 
    } 
    private void DG1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 
     Window1 windowToOpen = new Window1(); 
     var selectedUser = this.DG1.SelectedItem; 
     windowToOpen.Show(); 

    } 
} 

Основной класс, который загружает OnPropertyChanged У меня есть список свойств и строковое свойство, которое вызывает OnPropertyChanged, но я хочу, чтобы индивидуальное свойство «Runs» обновлялось самостоятельно, а не вся коллекция.

class CricketEvent : INotifyPropertyChanged 

{ 
    private ObservableCollection<CricketEvent> runsList; 
    public string runs { get; set; } 


    public CricketEvent(string numofRuns) { 
     this.Runs = numofRuns; 
    } 
    public CricketEvent() { } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<CricketEvent> RunsList 

    { 
     get { return this.runsList; } 

     set 
     { 
      if (value != this.runsList) 
      { 
       this.runsList = value; 
       OnPropertyChanged("RunsList"); 
      } 
     } 
    } 
    public string Runs 
    { 
     get { return runs; } 
     set 
     { 
      runs = value; 
      // Call OnPropertyChanged whenever the property is updated 
      OnPropertyChanged("Runs"); 
     } 
    } 


    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 


    public ObservableCollection<CricketEvent> updateList(CricketEvent []events) 
    { 
     runsList = new ObservableCollection<CricketEvent>(events.ToList()); 

     return runsList; 
    } 

} 

Это окно обновление, которое вызывает текстовое поле и должны изменить «1сек» В предыдущем окне на то, что набирается в текстовом поле

public partial class Window1 : Window 
{ 

    public Window1() 
    { 


     InitializeComponent(); 
    } 

    CricketEvent events = new CricketEvent(); 
    MainWindow main = new MainWindow(); 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     events.updateList(new CricketEvent[1] { new CricketEvent(txt1.Text.ToString()) }); 

     main.DG1.ItemsSource = events.RunsList; 

    } 
+0

'events.updateList (...)' не будет магически установить 'events.RunsList', если вы пишете' events.RunsList = events.updateList (...); ' – Clemens

ответ

0

Событие Button_Click в window1 не используйте экземпляр MainWindow, который показывает - он создает новый экземпляр Window (который не показан) и добавляет обновленный список в свойство DG1.ItemsSource. Чтобы решить эту проблему, передайте исходный экземпляр Window в созданный Window1 в конструкторе и используйте его.

Тем не менее, следует пересмотреть стратегию обновления (и стиль кода), потому что есть потенциал для improvments:

  • Это не очень хорошая идея, чтобы создать новую коллекцию, если вы хотите обновить только одно свойство одного предмета. Наблюдаемые коллекции предоставляют уведомление об изменении, поэтому вам не нужно воссоздавать коллекцию вообще.

  • Вместо того чтобы оценивать сбор в коде позади, используйте привязку данных для привязки коллекции к ItemsSource. DataBinding приводит к автоматическому обновлению элементов GUI, если коллекция или один элемент вашей коллекции изменились.

Смежные вопросы