Всплывающая подсказка не может привязать шаблон обратно к содержимому из datagridcell

#silverlight #xaml

#silverlight #xaml

Вопрос:

У меня есть элемент управления datagrid, в котором некоторые столбцы содержат текст, переполняющий соответствующие контейнеры.

Чтобы решить эту проблему, я добавляю всплывающую подсказку в controltemplate для datagridcell, затем привязываю содержимое всплывающей подсказки к содержимому данных с помощью templatebinding к свойству Content.

Приведенный ниже код Xaml:

       <Style x:Key="RotatedCell" TargetType="sdk:DataGridCell">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="sdk:DataGridCell">
              <ContentPresenter
                Content="{TemplateBinding Content}"
                ContentTemplate="{TemplateBinding ContentTemplate}" >
                <ToolTipService.ToolTip>
                  <ToolTip Content="{TemplateBinding Content}"/>
                </ToolTipService.ToolTip>
              </ContentPresenter>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
  

Сетка данных может быть отображена с данными, отображаемыми успешно, но при наведении курсора на
сообщается об ошибке столбца:
*
Ошибка среды выполнения Microsoft JScript: необработанная ошибка в приложении Silverlight [Строка: 0 Позиция: 0]

в MS.Internal.XcpImports.MethodEx(IntPtr ptr, имя строки, CValue[] cvData)
в MS.Internal.XcpImports.MethodEx(DependencyObject obj, строковое имя)
в MS.Internal.XcpImports.FrameworkElement_ApplyTemplate(FrameworkElement FrameworkElement)
в системе.Windows.Элементы управления.Управление.ApplyTemplate()

в системе.Windows.Элементы управления.Всплывающая подсказка.openPopup()

в системе.Windows.Элементы управления.Всплывающая подсказка.OnIsOpenChanged (логическое значение isOpen)
в системе.Windows.Элементы управления.Всплывающая подсказка.OnIsOpenPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

в системе.Windows.DependencyObject.RaisePropertyChangeNotifications (DependencyProperty dp, старое значение объекта, новое значение объекта)
в системе.Windows.DependencyObject.updateffectivevalue(свойство DependencyProperty, EffectiveValueEntry oldEntry, EffectiveValueEntry amp; newEntry, операция ValueOperation)
в системе.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, значение объекта, логическое значение allowReadOnlySet)

в системе.Windows.DependencyObject.setValue(свойство DependencyProperty, логическое значение b)

в системе.Windows.Элементы управления.ToolTipService.OpenAutomaticToolTip (отправитель объекта, EventArgs e)

в MS.Internal.CoreInvokeHandler.InvokeEventHandler (Int32 typeIndex, Delegate handlerDelegate, отправитель объекта, аргументы объекта)
в MS.Internal.JoltHelper.fireEvent (IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

*

Это явление меня озадачивает, потому что я думаю, что синтаксис xaml кажется правильным, и во время процессов сборки и загрузки не сообщается об ошибках. Похоже, что элемент управления всплывающей подсказки пытается применить шаблон при его появлении, но я думаю, что это должно быть сделано в то же время, когда был применен шаблон элемента управления datagridcell. У кого-нибудь есть идеи по этому поводу?

Ответ №1:

Попробуйте это:

 <Setter Property="ToolTip" Value={Binding Content} />
  

ОБНОВЛЕНИЕ: Да, я забыл, что вы спрашивали о Silverlight, а не о WPF. Это будет хорошо работать, я проверил:

 <Style x:Key="DataGridCellStyle"
           TargetType="sdk:DataGridCell">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="sdk:DataGridCell">
                    <Grid x:Name="Root"
                          Background="{TemplateBinding Background}">
                        <ToolTipService.ToolTip>
                            <ContentControl Content="{TemplateBinding Content}" />
                        </ToolTipService.ToolTip>
                        <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
                                          Content="{TemplateBinding Content}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          Margin="{TemplateBinding Padding}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  

Комментарии:

1. Спасибо за ответ. Я попробовал ваш метод, но, к сожалению, не сработал. Тип установщика не поддерживает прямое сопоставление, поэтому xaml не компилировался.

2. Да, я забыл, что вы спрашивали о Silverlight, а не о WPF.

3. Очень сожалею о тебе, Эйяфьятлайокудль. Я не заметил вашего запроса.

4. Я попробовал ваш метод, но, к сожалению, у меня он не сработал. В моей оригинальной программе старая ошибка все еще остается. И в моей другой экспериментальной программе при наведении курсора на ячейки вся сетка данных просто исчезает. И я должен извиниться за то, что не ответил вам быстро, и большое спасибо за ваш ответ.