代码之家  ›  专栏  ›  技术社区  ›  Miamy Dan Barrett

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

  •  1
  • Miamy Dan Barrett  · 技术社区  · 7 年前

    我的 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>
    

    我想为所有项目显示一个图像,因此在中创建了一个属性 类别:

    public ImageSource IconSource { get; set; } = 
      new BitmapImage(new Uri("../Resources/umf.png", UriKind.Relative));
    

    并尝试从模板中引用它:

     <Image Source="{Binding IconSource, 
        RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
    

    但是得到了错误

    在“对象”“ContentPresenter”上找不到“IconSource”属性 DataItem='ContentPresenter'(名称='');目标元素为“图像” (名称=“”);目标属性为“源”(类型为“ImageSource”)

    Source="{Binding IconSource, 
      RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:TileView}}}"
    

    我明白了

    System.Windows.Data错误:4:找不到与绑定的源 参考“相对资源查找器”, AncestorType='ClientWPF.Controls.TileView',AncestorLevel='1'。 BindingExpression:Path=IconSource;DataItem=null;目标元素是 “图像”(名称=“”);目标属性为“源”(类型为“ImageSource”)

    当然,我可以将一个图像转换成数据模型,但我不喜欢这种方式,原因很明显。

    那我怎么才能参考呢 ItemSource 财产

    1 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    一个视图没有一个 ItemTemplate . 它适用于 ControlTemplate ListView . 在这个视图中,您可以访问如下视图的属性:

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

    内置的 GridView

    内部 列表视图 View 这样地:

    {Binding View.IconSource, RelativeSource={RelativeSource AncestorType=ListView}}