2011-12-15 3 views
0

Xaml RadGridRadGrid Привязка к списку

<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 динамически, то radgridview не обновляется автоматически, это работает, если сбросить ItemsSource в код:

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

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

ответ

0

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

Если вы можете forgoe имея 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 ... не уверены, что это намеренно.

+0

Почему мы используем 2 разных списка здесь (MyObservableList, Мой список)? не можем ли мы просто использовать один список и связать его с источником radgrids itemssource? Благодарю. – user832219

+0

Вот что я говорил о том, чтобы сделать его проще. Я только включил, что если вы не можете установить свойство ObservableCollection, то вы можете обернуть свой список ObservableCollection (ObservableList). Было бы гораздо проще просто использовать ObservableCollection. – Jeff

+0

Я постараюсь сделать это так! Ценить это! – user832219

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