Silverlight 3 - Как «обновить» контент DataGrid? - PullRequest
2 голосов
/ 01 декабря 2009

У меня есть следующие декорации:

1    using System;
2    using System.Windows;
3    using System.Windows.Controls;
4    using System.Windows.Documents;
5    using System.Windows.Ink;
6    using System.Windows.Input;
7    using System.Windows.Media;
8    using System.Windows.Media.Animation;
9    using System.Windows.Shapes;
10   using System.Collections.Generic;
11   
12   namespace refresh
13   {
14      public partial class MainPage : UserControl
15      {
16          
17          List c = new List();
18   
19          public MainPage()
20          {
21              // Required to initialize variables
22              InitializeComponent();
23              c.Add(new Customer{ _nome = "Josimari", _idade = "29"});
24              c.Add(new Customer{_nome = "Wesley", _idade = "26"});
25              c.Add(new Customer{_nome = "Renato",_idade = "31"});    
26              
27              this.dtGrid.ItemsSource = c;
28          }
29   
30          private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
31          {
32              c.Add(new Customer{_nome = "Maiara",_idade = "18"});
33          }
34          
35      }
36      
37      public class Customer
38      {
39          public string _nome{get; set;}
40          public string _idade{get; set;}
41      }
42   }

Где dtGrid - это мой элемент управления DataGrid ...

Вопрос в том, как обновить интерфейс после добавления еще одного регистра в мой список.

Я могу решить эту проблему, установив «Источник элемента» в DataGrid на «», а затем снова установив список объектов Customer, например:

1    private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
2    
3    {
4    
5    c.Add(new Customer{_nome = "Maiara",_idade = "18"});
6    
7    this.dtGrid.ItemsSource="";
8    
9    this.dtGrid.ItemsSource=c;
10   
11   }
12   

Существует ли способ обновления пользовательского интерфейса или автоматического обновления источника элементов данных таблицы после обновления, изменения или удаления элемента из списка c?

Спасибо,

Йосимари Мартарелли

1 Ответ

8 голосов
/ 01 декабря 2009

Я рекомендую изучить привязку, INotifyPropertyChanged, DataContexts и ObservableCollection.

  1. Измените List на ObservableCollection. Одно это, вероятно, решит некоторые ваши проблемы ... поскольку ObservableCollection немного более надежен, чем простой List

  2. Но, если вы хотите решить больше подобных проблем, вам нужно будет связать свой DataGrid со списком объектов через Xaml <DataGrid... ItemsSource="{Binding MyList}">

  3. Чтобы связать DataGrid с List, вам необходимо установить DataContext вида. Это может быть просто, как размещение в вашем конструкторе: this.DataContext = this; Установка вашего DataContext сообщает представлению, где искать данные, когда он видит Binding операторов

  4. Затем, чтобы решить проблемы, подобные той, которая у вас есть (изменение чего-либо не обновляет представление), вы реализуете интерфейс INotifyPropertyChanged в своем классе. Это позволит коду отправлять уведомления представлению, чтобы сообщать, когда что-то меняется.

Вот код C #, который реализует это:

public partial class MainPage : UserControl, INotifyPropertyChanged
{
    private ObservableCollection<Customer> _MyList = 
        new ObservableCollection<Customer>();
    public ObservableCollection<Customer> MyList
    {
        get { return _MyList; }  
    } 

    public MainPage()
    {                      
        InitializeComponent();

        this.DataContext = this;

        MyList.Add(new Customer{ _nome = "Josimari", _idade = "29"});
        MyList.Add(new Customer{_nome = "Wesley", _idade = "26"});
        MyList.Add(new Customer{_nome = "Renato",_idade = "31"});

        OnPropertyChanged("MyList"); // This only works if you use bindings.
    }

    private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        MyList.Add(new Customer{_nome = "Maiara",_idade = "18"});   

        OnPropertyChanged("MyList"); // This only works if you use bindings.
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged( string propertyName )
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    } 
}
...