2013-12-11 2 views
0

Я использую следующий код для связыванияКак уведомить свойства XAML при изменении списка данных привязки?

XAML

<StackPanel x:Name="channelsRecordTimeData" Orientation="Vertical"> 
    <ItemsControl x:Name="channelRecordTimeItems" ItemsSource="{Binding}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid x:Name="gridChannelRecordTimeItem" Width="{Binding Path=ChannelRecordTimeItemWidth}"                             
         Height="{Binding Path=ChannelRecordTimeItemHeight}" Margin="{Binding Path=ChannelRecordTimeItemsMargin}" 
         HorizontalAlignment="Left" DataContext="{Binding Path=ListRecordTime}"> 
        <Grid.Background> 
         <ImageBrush x:Name="gridChannelRecordTimeItemBgr" ImageSource="..\Resources\playback_grid_channel_record_time_item_bgr_normal.png"/> 
        </Grid.Background>          
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</StackPanel> 

C#

public class DATA 
{ 
    public double ChannelRecordTimeItemWidth { set; get; } 
    public double ChannelRecordTimeItemHeight { set; get; } 
    public Thickness ChannelRecordTimeItemsMargin { set; get; } 
    public List<RecordTime> ListRecordTime { set; get; } 

    public DATA() 
    { 
     ChannelRecordTimeItemWidth = 1000; 
     ChannelRecordTimeItemHeight = 20; 
     ChannelRecordTimeItemsMargin = new System.Windows.Thickness(0, 0, 0, 0); 
     ListRecordTime = null; 
    } 
} 

public static List<DATA> listDATA = new List<DATA>(); 
for(int i = 0 ; i < 10 ; i++) 
{ 
    DATA data = new DATA(); 
    listDATA.Add(data); 
} 
channelRecordTimeItems.ItemsSource = listDATA; 
channelRecordTimeItems.Items.Refresh(); 

Этот код будет уведомлять обновления XAML, когда я использую строку кода в

listDATA[0].ChannelRecordTimeItemWidth -= 15; 

Существует любой способ изменения свойств XAML автоматически, whe п мы манипулируем на ListData, как

listDATA.RemoveAt(); 
listDATA.Add(); 
listDATA.Clear(); 

Без вызова код следующие две строки

channelRecordTimeItems.ItemsSource = listDATA; 
channelRecordTimeItems.Items.Refresh(); 

ответ

1

GUI будет обновляться только в случае underlying source collection is implementing INotifyCollectionChanged которые поднимают CollectionChanged события, освежения компоненты графического интерфейса.

Вы можете использовать ObservableCollection, который внутренне предоставляет вам эту функцию.

Заменить

public static List<DATA> listDATA = new List<DATA>(); 

с

public static ObservableCollection<DATA> listDATA = new ObservableCollection<DATA>(); 
+0

Спасибо! Но можете ли вы показать мне небольшой пример кода? – TTGroup

+1

Вам нужно заменить 'List ' '' ObservableCollection 'only. Отдых будет работать так, как есть. –

+1

Также вы можете обратиться к примеру наконец [здесь] (http://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx). –

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