2013-12-11 4 views
0

Я пишу следующий код для связывания некоторых свойствпривязка DataTemplate не работает?

<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> 

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(); 

Нагревание выше кода, я добавил 10 пунктов в StackPanel, но я не вижу каких-либо элементы, добавленные при запуске приложения. Но когда я заменяю Width="{Binding Path=ChannelRecordTimeItemWidth}" на Width="1000" и заменяю Height="{Binding Path=ChannelRecordTimeItemHeight}" на Height="20", тогда он отлично работает!

Я думаю, это проблема привязки, но я не знаю почему.

Кто-то может сказать мне, как заставить его работать?

Большое спасибо,

T & T

ответ

1

Обновите DATA класс реализации INotifyPropertyChanged как так:

public class DATA : : INotifyPropertyChanged 
{ 
    private double _channelRecordTimeItemWidth; 
    private double _channelRecordTimeItemHeight; 
    private Thickness _channelRecordTimeItemsMargin; 
    private List<RecordTime> _listRecordTime; 

    public double ChannelRecordTimeItemWidth 
    { 
     get { return _channelRecordTimeItemWidth; } 
     set 
     { 
      _channelRecordTimeItemWidth = value; 
      OnPropertyChanged("ChannelRecordTimeItemWidth"); 
     } 
    } 

    public double ChannelRecordTimeItemHeight 
    { 
     get { return _channelRecordTimeItemHeight; } 
     set 
     { 
      _channelRecordTimeItemHeight = value; 
      OnPropertyChanged("ChannelRecordTimeItemHeight"); 
     } 
    } 

    public Thickness ChannelRecordTimeItemsMargin 
    { 
     get { return _channelRecordTimeItemsMargin; } 
     set 
     { 
      _channelRecordTimeItemsMargin = value; 
      OnPropertyChanged("ChannelRecordTimeItemsMargin"); 
     } 
    } 

    public List<RecordTime> ListRecordTime 
    { 
     get { return _listRecordTime; } 
     set 
     { 
      _listRecordTime = value; 
      OnPropertyChanged("ListRecordTime"); 
     } 
    } 

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

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

Это будет уведомлять XAML обновить ограниченное значение.

DataContext также должен быть установлен правильно. Сначала удалите связанный DataContext из Grid:

<DataTemplate> 
     <Grid x:Name="gridChannelRecordTimeItem" Width="{Binding Path=ChannelRecordTimeItemWidth}"                             
       Height="{Binding Path=ChannelRecordTimeItemHeight}" Margin="{Binding Path=ChannelRecordTimeItemsMargin}" 
       HorizontalAlignment="Left"> 
      <Grid.Background> 
       <ImageBrush x:Name="gridChannelRecordTimeItemBgr" ImageSource="..\Resources\playback_grid_channel_record_time_item_bgr_normal.png"/> 
      </Grid.Background>          
     </Grid> 
    </DataTemplate> 

и убедитесь, что DataContext для XAML (является ли это UserControl, окна и т.д.), устанавливается на ваш DATA класса.

+0

Это очень круто для решения моей проблемы и показать мне, как использовать интерфейс INotifyPropertyChanged. Большое спасибо! – TTGroup

+0

Еще одна проблема, которую я поднял http://stackoverflow.com/questions/20515233/how-to-notify-xaml-properties-when-list-data-of-binding-changed Не могли бы вы ее увидеть? Спасибо! – TTGroup

1

Ваше решение не может работать из-за этой линии

DataContext="{Binding Path=ListRecordTime}" 

Эта строка устанавливает DataContext для сетки, то вы пытаетесь получить ChannelRecordTimeItemHeight от DataContext - список recordtimes.

Удалить эту линию и посмотреть, что происходит

+0

Это сработало! Спасибо! – TTGroup

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