2013-12-11 48 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 n我們在操作上的listData作爲

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

如果不調用以下兩個行代碼

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

回答

1

GUI只會在情況underlying source collection is implementing INotifyCollectionChanged由此引發CollectionChanged事件刷新GUI組件進行更新。

您可以使用ObservableCollection,它在內部爲您提供此功能。

更換

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

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

謝謝!但是你能告訴我一些示例代碼嗎? – TTGroup

+1

您只需要將'List '替換爲'ObservableCollection '。休息會照原樣運作。 –

+1

另外,你可以參考最後的例子[這裏](http://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx)。 –

相關問題