我的ListView
具有自定义View
:
public class TileView : ViewBase
{
public DataTemplate ItemTemplate { get; set; }
public ImageSource IconSource { get; set; } = new BitmapImage(new Uri("../Resources/umf.png", UriKind.Relative));
protected override object DefaultStyleKey => new ComponentResourceKey(GetType(), "TileView");
protected override object ItemContainerDefaultStyleKey => new ComponentResourceKey(GetType(), "TileViewItem");
}
使用下一个DataTemplate
:
<local:TileView>
<local:TileView.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image
Source="{Binding IconSource, RelativeSource={RelativeSource Mode=TemplatedParent}}"
/>
</StackPanel>
</DataTemplate>
</local:TileView.ItemTemplate>
</local:TileView>
我想为所有项目显示一个图像,所以我在View
类中创建了一个属性:
public ImageSource IconSource { get; set; } =
new BitmapImage(new Uri("../Resources/umf.png", UriKind.Relative));
并尝试从模板中引用它:
<Image Source="{Binding IconSource,
RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
但获得错误
System.Windows.Data错误:40:BindingExpression路径错误: 在“对象”“ ContentPresenter”上找不到“ IconSource”属性 (名称='')''。 BindingExpression:Path = IconSource; DataItem ='ContentPresenter'(Name ='');目标元素是“图片” (名称='');目标属性为“来源”(类型为“图片来源”)
当我尝试写
Source="{Binding IconSource,
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:TileView}}}"
我明白了
System.Windows.Data错误:4:找不到与之绑定的源 参考'RelativeSource FindAncestor, AncestorType ='ClientWPF.Controls.TileView',AncestorLevel ='1''。 BindingExpression:Path = IconSource; DataItem = null;目标元素是 '图片'(名称='');目标属性为“来源”(类型为“图片来源”)
当然,我可以将图像用于数据模型,但是出于明显的原因,我不喜欢这种方式。
那么如何从模板中引用ItemSource
的{{1}}属性?谢谢。
答案 0 :(得分:1)
视图没有ItemTemplate
。它将ControlTemplate
应用于ListView
。在此视图内部,您可以看到这样的视图属性:
{Binding Path=TemplatedParent.View.IconSource, RelativeSource={RelativeSource TemplatedParent}}
这就是内置ControlTemplate
的{{1}}的作用。
在GridView
本身的ItemTemplate
内部,您可以像这样绑定到ListView
的属性:
View