我坚持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
但它们是空的,如图所示
如果我将MyItem
更改为
public class MyItem
{
public string Title { get; set; }
public string Content { get; set; }
}
然后它按预期开始工作,如图所示
当我从MyItem
继承UserControl
时,我无法弄清楚数据绑定的问题是什么?
修改
我的要求是在RadTileView
的内容区域中显示自定义用户控件,在RadTileView
的标题区域中显示标题文本,如何实现?
答案 0 :(得分:2)
如果项目不是数据,那么控件将不会使用数据模板,简单明了。如果该类应该是数据,那么不继承自UserControl
(如果你这样做,你也会破坏模型 - 视图 - 分离)。
该项目仅由RadTileView
评估为一个实体,因此如果整个项目被视为可显示,则忽略数据模板。如果您必须执行此操作,请将UserControl
移至属性并在ContentTemplate
中使用该属性(仅包含ContentPresenter
Content
绑定UserControl
到包含{{ 1}})。
如果您希望遵守模型 - 视图分离,则不应继承任何与UI相关的类,并且Content
应包含数据,然后可以使用{ContentTemplate
模板化这些数据。 {1}}你想要的。
答案 1 :(得分:0)
我认为你不能这样做是因为你绑定了UIElements。因此,WPF将使用它们作为项目,而不是您的类属性。