Привязка RadGrid к списку - PullRequest
       18

Привязка RadGrid к списку

0 голосов
/ 15 декабря 2011

XAML RadGrid

<telerik:RadGridView d:DataContext="{d:DesignInstance {x:Type local:A}}" Name="myGridView" Grid.Column="2" ItemsSource="{Binding Path=MyList}"  Margin="7,7,7,2" IsFilteringAllowed="False" ShowColumnHeaders="True" AutoGenerateColumns="True" />

C # код

Class A:INotifyPropertyChanged
{
 private List<Fields> MyList;
 public event PropertyChangedEventHandler PropertyChanged;
public List<Fields> _theList
{
  get
  {
    if (MyList == null)
    {
      MyList = new List<Fields>();
    }
    return MyList;
  }
  set
  {
    if (MyList != value)
    {
      MyList = value;
      PropertyChanged(this, new PropertyChangedEventArgs("_theList"));
    }
  }
}    
}

Когда элементы в MyList изменяются динамически, представление radgrid не обновляется автоматически, оно работает, если я сбрасываю источник в коде:

mygridview.Itemssource = Null;
mygridview.Itemssource = MyList;

Мне приходится каждый раз сбрасывать ресурс источника в коде после изменения MyList. Почему GridView не обновляется автоматически при изменении содержимого MyList? Кроме того, во время разработки он показывает мне соответствующие заголовки столбцов без данных в столбцах, потому что список пуст. Но когда я запускаю приложение, заголовки столбцов исчезают, и данные не отображаются в Radgrid, когда содержимое MyList изменяется динамически.

1 Ответ

0 голосов
/ 15 декабря 2011

When the items in MyList change dynamically,

Вы уведомляете, когда изменяется свойство списка ... что не распространяется на описанный выше сценарий. Для поддержки того, что вы хотите, я думаю, вам нужна коллекция, которая поддерживает интерфейс INotifyCollectionChanged.

http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

Из коробки ObservableCollection поддерживает это. Это происходит от IList<T>. Так что, возможно, вы могли бы сделать:

 private IList<Fields> MyList;
 private IList<Fields> MyObservableList;
 public event PropertyChangedEventHandler PropertyChanged;
public IList<Fields> _theList
{
  get
  {
    if (MyObservableList == null)
    {
      MyObservableList = new ObservableCollection<Fields>();
    }
    return MyObservableList;
  }
  set
  {
    if (MyList != value)
    {
      MyList = value;
      MyObservableList = new ObservableCollection<Fields>(MyList );
      // this will throw a null reference exception if no one' is listening. You 
      PropertyChanged(this, new PropertyChangedEventArgs("_theList"));
    }
  }
}  

Если вы можете отказаться от экземпляра List<T> за экземпляр ObserableCollection<T>, вышеприведенное может быть еще проще:

   private ObservableCollection<Fields> MyList;
     public event PropertyChangedEventHandler PropertyChanged;
    public ObservableCollection<Fields> _theList
    {
      get
      {
        if (MyList== null)
        {
          MyList= new ObservableCollection<Fields>();
        }
        return MyList;
      }
      set
      {
        if (MyList != value)
        {
          MyList = value;
          // this will throw a null reference exception if no one' is listening. You should make a method OnPropertyChanged that checks if PropertyChanged != null.
          PropertyChanged(this, new PropertyChangedEventArgs("_theList"));
        }
      }
    }

Кроме того, как правило, закрытые члены - это _camelCase, а открытые члены - PascalCase ... не уверен, намеренно ли это.

...