【问题标题】:DataTemplate binding doesn't work?DataTemplate 绑定不起作用?
【发布时间】:2013-12-11 05:53:12
【问题描述】:

我正在编写以下代码来绑定一些属性

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

在上面的代码中,我在 StackPanel 中添加了 10 个项目,但在运行 app 时我没有看到任何添加的项目。 但是当我将Width="{Binding Path=ChannelRecordTimeItemWidth}" 替换为Width="1000" 并将Height="{Binding Path=ChannelRecordTimeItemHeight}" 替换为Height="20" 时,它就可以正常工作了!

我认为,这是绑定的问题,但我不知道为什么。

谁能告诉我如何让它工作?

非常感谢,

T&T

【问题讨论】:

    标签: c# wpf binding


    【解决方案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 也应该正确设置。先去掉Grid的绑定DataContext

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

    并确保 XAML(无论是 UserControl、Window 等)的 DataContext 设置为您的 DATA 类。

    【讨论】:

    • 解决我的问题并向我展示如何使用 INotifyPropertyChanged 接口非常酷。非常感谢!
    • 我提出的另一个问题stackoverflow.com/questions/20515233/… 你能看到吗?谢谢!
    【解决方案2】:

    由于这条线,您的解决方案无法工作

     DataContext="{Binding Path=ListRecordTime}" 
    

    此行设置网格的数据上下文,然后您尝试从数据上下文获取 ChannelRecordTimeItemHeight - 记录时间列表。

    删除这一行,看看会发生什么

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 2011-12-23
      • 2013-10-23
      • 2018-07-31
      • 1970-01-01
      • 2012-12-12
      • 2017-12-02
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多