【发布时间】:2019-06-09 06:46:09
【问题描述】:
我的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”属性 (名称='')'。绑定表达式:路径=图标源; DataItem='ContentPresenter' (Name='');目标元素是“图像” (名称='');目标属性是'Source'(类型'ImageSource')
当我尝试写作时
Source="{Binding IconSource,
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:TileView}}}"
我明白了
System.Windows.Data 错误:4:找不到绑定源 参考'RelativeSource FindAncestor, AncestorType='ClientWPF.Controls.TileView',AncestorLevel='1''。 绑定表达式:路径=图标源;数据项=空;目标元素是 '图像'(名称='');目标属性是'Source'(类型'ImageSource')
当然,我可以将图像放入数据模型中,但出于显而易见的原因,我不喜欢这种方式。
那么如何从我的模板中引用View 的ItemSource 属性?谢谢。
【问题讨论】:
-
视图没有
ItemTemplate。它将ControlTemplate应用于ListView。你到底想做什么? -
ItemTemplate是TileView类的属性。对不起,我错误地省略了这一行。 -
我从 Matthew MacDonald 的“Pro WPF in C# 2008”一书中的一个示例开始,并尝试根据我的目的对其进行调整。
Generic.xaml定义了明确的样式,并添加了一些自定义视图。为了应用视图,我只写了ListView.View = (ViewBase)FindResource("ImageView");。