Связывание из ресурсов внутри DataTemplate - PullRequest
2 голосов
/ 23 марта 2011

Есть ли способ получить DataContext из DataTemplate для использования в привязках в его ресурсах?

<DataTemplate x:Key="History">
  <ItemsControl ItemsSource="{Binding History}">
    <ItemsControl.Resources>
      <app:BitmapProvider x:Key="Converter" ShowDetails="True"
                          Type="{Binding Model.Type}" />
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal" IsItemsHost="True"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <Image Source="{Binding Data, Converter={StaticResource Converter}}" />
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</DataTemplate>

Приведенный выше шаблон используется как CellTemplate для ListBox. Объект на этом уровне имеет два свойства: History (содержащий список объектов «исторической информации») и Model (содержащее множество других вещей, включая Type). Я использую ItemsControl для отображения исторических предметов рядом друг с другом; Я хочу отобразить изображение для каждого, и изображение получается из BitmapProvider, который является IValueConverter.

Конвертеру нужны два бита информации для получения результата: один - Data отдельных исторических предметов, а другой - Type всей коллекции. Дополнительным осложнением является то, что создание этого конкретного конвертера (или изменение заданного ему Type) является дорогостоящим, поэтому я не хочу ставить его на уровне отдельного элемента истории или использовать MultiBinding, и Я не могу поместить его вне шаблона, потому что тогда у него не будет доступа к Type.

К сожалению, вышесказанное дает мне следующую ошибку:

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = Model.Type; DataItem = NULL; целевым элементом является «BitmapProvider» (HashCode = 57142809); целевое свойство 'Type' (тип 'TypeDetails')

Я понимаю, что ресурс не может понять, как получить DataContext элемента, в котором он содержится.

(Я искал, и большинство ответов, которые я мог найти, предлагали переместить его за пределы шаблона или использовать вместо него MultiBinding - ни один из которых не будет работать в этом случае, насколько я могу судить, поскольку Я объяснил выше. Но я был бы рад, если бы я оказался неправ или получил бы другую альтернативу.)

1 Ответ

3 голосов
/ 23 марта 2011

Я думаю, что вы можете сделать это с DataContextSpy .

попробуйте что-то вроде:

<ItemsControl.Resources>
  <spy:DataContextSpy x:Key="Spy"/>
  <app:BitmapProvider x:Key="Converter" ShowDetails="True"
                      Type="{Binding DataContext.Model.Type,Source={StaticResource Spy}}" />
</ItemsControl.Resources>
...