SL4. Привязка по ElementName не работает в DataTemplate - PullRequest
4 голосов
/ 08 ноября 2011

Существует еще одна головная боль с DataTemplate.


Описание: Использование Silverlight 4, Mvvm и т. Д. (Стандартный набор инструментов разработчика для LOB-приложений Silverlight).

Список объектов успешно привязан к DataGrid. Одно свойство (nullable bool BoolValue) отвечает за поведение сущности и представлено в сетке данных с рисунком, щелкнув по которому, можно изменить видимость некоторых элементов управления в элементе LayoutRoot.

Проблема: Проблема в том, что, к сожалению или к счастью, привязка ElementName внутри DataTemplate не видит других элементов, кроме тех, которые размещены в этом шаблоне.

Пример кода:

<navigation:DataGridTemplateColumn Width="40"
                              CanUserReorder="True"
                              CanUserSort="False">
     <navigation:DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
             <Border Background="GhostWhite">
             <Grid>
              <Image x:Name="ImageWithTrigger"
                     Grid.Column="1"
                     Margin="10,4,0,0"
                     HorizontalAlignment="Left"
                     VerticalAlignment="Center"
                     Cursor="Hand"
                     Source="images/someImage.png"
                     Stretch="None"
                     Visibility={Binding BoolValue, Converter={StaticResource boolToVisibilityConverter} }>
               <i.Interaction.Triggers>
                 <i:EventTrigger EventName="MouseLeftButtonDown">
                     <AttachedBehaviors:TrickyBehavior FrameworkElementToHide="{Binding ElementName=FirstControlOutside}" 
                                                       FrameworkElementToShow="{Binding ElementName=SecoundControlOutside}"/>
                 </i:EventTrigger>
              </i:Interaction.Triggers>
            </Grid>
            </Border>
          </DataTemplate>
     </navigation:DataGridTemplateColumn.CellTemplate>
</navigation:DataGridTemplateColumn>

В приведенном выше примере FrameworkElementToHide и FrameworkElementToShow всегда равны нулю.

В интернете очень много похожих проблем и решений, но я не нашел простого и элегантного способа решения этой проблемы.

Ответы [ 2 ]

6 голосов
/ 08 ноября 2011

пожалуйста, посмотрите на мой ответ в этом сообщении .

Привязка ElementName не работает в DataGrid. Вам нужен прокси, чтобы обойти это. Однако привязка ElementName работает для нормального DataTemplates, например ItemTemplate из ListBox и т. Д.

1 голос
/ 08 ноября 2011

[Это должен быть комментарий, но я превысил допустимое количество символов]

Я вижу два пути решения этой проблемы:

  1. наследуется от ContentControl; добавить свойство IsShowing (bool), которое будет переключаться между двумя состояниями; В шаблоне элемента управления для нового элемента управления сделайте нужные анимации для отображения и скрытия контента.
  2. добавить статический класс, который будет содержать словарь для хранения ссылок на элементы; добавить прикрепленное свойство (bool) с PropertyChangedCallback в метаданные - если новое значение равно true: добавить элемент (к которому присоединено свойство) в словарь, если false: удалить элемент из словаря; ключом для каждого элемента является его имя; поведение получит две строки, которые являются именами элементов, и будет искать их в словаре.

Оба способа не так уж и элегантны, но это Silverlight ...; -)

...