【问题标题】:How to reference a property of the view from the data template如何从数据模板中引用视图的属性
【发布时间】: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')

当然,我可以将图像放入数据模型中,但出于显而易见的原因,我不喜欢这种方式。

那么如何从我的模板中引用ViewItemSource 属性?谢谢。

【问题讨论】:

  • 视图没有ItemTemplate。它将ControlTemplate 应用于ListView。你到底想做什么?
  • ItemTemplateTileView 类的属性。对不起,我错误地省略了这一行。
  • 我从 Matthew MacDonald 的“Pro WPF in C# 2008”一书中的一个示例开始,并尝试根据我的目的对其进行调整。 Generic.xaml 定义了明确的样式,并添加了一些自定义视图。为了应用视图,我只写了ListView.View = (ViewBase)FindResource("ImageView");

标签: c# wpf listview


【解决方案1】:

视图没有ItemTemplate。它将ControlTemplate 应用于ListView。在这个里面,你可以像这样查看一个属性:

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

这就是内置GridViewControlTemplate 的作用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多