如何从数据模板引用视图的属性

时间:2019-01-15 09:13:50

标签: c# wpf listview

我的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}}属性?谢谢。

1 个答案:

答案 0 :(得分:1)

视图没有ItemTemplate。它将ControlTemplate应用于ListView。在此视图内部,您可以看到这样的视图属性:

{Binding Path=TemplatedParent.View.IconSource, RelativeSource={RelativeSource TemplatedParent}}

这就是内置ControlTemplate的{​​{1}}的作用。

GridView本身的ItemTemplate内部,您可以像这样绑定到ListView的属性:

View