Как ссылаться на свойство представления из шаблона данных - PullRequest
0 голосов
/ 15 января 2019

Мой 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 class:

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: Свойство 'IconSource' не найдено в 'объекте' '' ContentPresenter ' (Name = '')». BindingExpression: Path = 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' '. BindingExpression: Path = IconSource; DataItem = NULL; целевой элемент 'Image' (Name = ''); Свойство target - «Источник» (тип «ImageSource»)

Конечно, я могу встроить изображение в модель данных, но мне не нравится этот путь по понятным причинам.

Итак, как я могу сослаться на ItemSource свойство View из моего шаблона? Спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Вид не имеет ItemTemplate. Применяется ControlTemplate к ListView. Внутри этого вы можете получить свойство зрения, подобное этому:

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

Это то, что делает ControlTemplate встроенного GridView.

Внутри ItemTemplate самого ListView вы можете связать свойство View следующим образом:

{Binding View.IconSource, RelativeSource={RelativeSource AncestorType=ListView}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...