如何绑定UserControl类型对象的Observable集合

时间:2012-08-24 17:05:09

标签: wpf data-binding user-controls telerik observablecollection

我坚持WPF中的数据绑定问题。以下是该方案。

我有一个 Telerik RadTileView,它绑定到ObservableCollection类型的MyItem

public class MyItem : UserControl
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }
正在填充

ObservableCollection

        private ObservableCollection<MyItem> items_ = null;
        public ObservableCollection<MyItem> TileItems
        {
            get 
            {
                if (items_ == null)
                {
                    items_ = new ObservableCollection<MyItem>();
                    items_.Add(new MyItem() { Title = "ABC", Content = "Test Content" });
                    items_.Add(new MyItem() { Title = "DEF", Content = "Test Content1" });
                    items_.Add(new MyItem() { Title = "GHI", Content = "Test Content2" });
                }

                return items_;
            }
            set 
            {
                items_= value;
                OnPropertyChanged("TileItems");
            }
        }

XAML

<DataTemplate x:Key="headerTemplate">
                        <TextBlock Text="{Binding Title, Converter={StaticResource debugconv}}"></TextBlock>
                    </DataTemplate>

<telerik:RadTileView x:Name="WidgetTileView"
                                      ItemsSource="{Binding TileItems}" ColumnWidth="Auto"
                              ItemTemplate="{StaticResource headerTemplate}">
                </telerik:RadTileView>

当我运行上面的代码时,它显示三个空RadTileView但它们是空的,如图所示 Empty Tiles

如果我将MyItem更改为

    public class MyItem
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }

然后它按预期开始工作,如图所示 Correct RadTileView

当我从MyItem继承UserControl时,我无法弄清楚数据绑定的问题是什么?

修改 我的要求是在RadTileView的内容区域中显示自定义用户控件,在RadTileView的标题区域中显示标题文本,如何实现?

2 个答案:

答案 0 :(得分:2)

如果项目不是数据,那么控件将不会使用数据模板,简单明了。如果该类应该是数据,那么继承自UserControl(如果你这样做,你也会破坏模型 - 视图 - 分离)。

该项目仅由RadTileView评估为一个实体,因此如果整个项目被视为可显示,则忽略数据模板。如果您必须执行此操作,请将UserControl移至属性并在ContentTemplate中使用该属性(仅包含ContentPresenter Content绑定UserControl到包含{{ 1}})。

如果您希望遵守模型 - 视图分离,则不应继承任何与UI相关的类,并且Content应包含数据,然后可以使用{ContentTemplate模板化这些数据。 {1}}你想要的。

答案 1 :(得分:0)

我认为你不能这样做是因为你绑定了UIElements。因此,WPF将使用它们作为项目,而不是您的类属性。