Как использовать свойство depenceny в стиле всплывающей подсказки для установки текста?

#wpf #dependency-properties #wpf-style

#wpf #зависимость-свойства #wpf-стиль

Вопрос:

В кнопке я использую свойство зависимости для передачи информации из модели представления в стиль кнопки, поэтому я могу установить цвет цвета в соответствии с некоторыми условиями.

Код для кнопки такой:

Стиль в моем файле xaml:

 <Style x:Key="BotonesColorEstadosTemplate" TargetType="{x:Type Button}">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type Button}">
        <ControlTemplate.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="dp:BotonesEstadosAttachedProperty.CodigoEstado" Value="0"/>
                    <Condition Property="dp:BotonesEstadosAttachedProperty.AccionHabilitada" Value="true"/>
                </MultiTrigger.Conditions>
            </MultiTrigger>
        <ContentTemplate>
    </ContentTemplate>
</Style>
  

Свойства зависимостей:

 public static class BotonesEstadosAttachedProperty
{
    public static readonly DependencyProperty CodigoEstadoProperty =
        DependencyProperty.RegisterAttached(
        "CodigoEstado",
        typeof(short),
        typeof(BotonesEstadosAttachedProperty));

    public static short GetCodigoEstado(DependencyObject obj)
    {
        return (short)obj.GetValue(CodigoEstadoProperty);
    }

    public static void SetCodigoEstado(DependencyObject obj, short value)
    {
        obj.SetValue(CodigoEstadoProperty, value);
    }


    public static readonly DependencyProperty AccionHabilitadaProperty =
        DependencyProperty.RegisterAttached(
        "AccionHabilitada",
        typeof(bool),
        typeof(BotonesEstadosAttachedProperty));

    public static bool GetAccionhabilitada(DependencyObject obj)
    {
        return (bool)obj.GetValue(AccionHabilitadaProperty);
    }

    public static void SetAccionHabilitada(DependencyObject obj, bool value)
    {
        obj.SetValue(AccionHabilitadaProperty, value);
    }
}
  

Как использовать в кнопке:

 <Button Name="btnAlmacenesActualizar" Content="..." Height="23" Margin="3,0,0,0" Width="23"
    ap:BotonesEstadosDependencyProperty.CodigoEstado="{Binding CodigoEstadoActualizarAlmacenes}"
    ap:BotonesEstadosDependencyProperty.AccionHabilitada="{Binding EsAccionActualizarAlmacenesHabilitada}">
  

С помощью этого я могу использовать свойство моей модели представления и перейти к своему стилю, который использует информацию в триггере для установки цвета кнопки.

Теперь я хотел бы иметь стиль для всплывающей подсказки, чтобы иметь конфигурацию по умолчанию для всех всплывающих подсказок, и я хотел бы сначала передать текст всплывающей подсказки, но позже я хотел бы передать другие переменные. На данный момент, для тестирования, я хотел бы попробовать с текстом.

У меня есть этот стиль:

 <Style TargetType="ToolTip" x:Key="ToolTipDefaultStyle">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel>
                    <TextBlock>
                        <TextBlock.Style>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="Text" Value="dp:ToolTipAttachedProperty.Texto"/>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
  

Моя панель стека с всплывающей подсказкой:

 <StackPanel Name="spTiposIva" Orientation="Vertical" Margin="5,0,0,0"
            ap:ToolTipDependencyProperty.Texto="{Binding TiposIvaTooltip}">
    <StackPanel.ToolTip>
        <ToolTip Style="{StaticResource ToolTipDefaultStyle}"/>
    </StackPanel.ToolTip>
</StackPanel>
  

Но в этом случае отображается текст «dp: ToolTipAttachedProperty.Texto». Поэтому я хотел бы, если возможно сделать то же самое, что и с кнопкой, использовать свойство зависимостей для передачи информации из модели представления в стиль.

Спасибо.

Ответ №1:

В настоящее время вы не привязываете прикрепленное свойство, вы присваиваете строку как Value . Для привязки к вложенным свойствам необходимо использовать расширение разметки привязки и круглые скобки, например:

 <Setter Property="Text" Value="{Binding (dp:ToolTipAttachedProperty.Texto)"/>
  

Однако в вашем случае вам нужно обратиться к родительскому элементу управления ToolTip , к которому привязано ваше свойство. Обычно вы делаете это с RelativeSource помощью привязки и AncestorType , но здесь это не работает, потому ToolTip что не находится в том же визуальном дереве, что и родительский элемент управления.

Вместо этого вы можете получить доступ к элементу управления через PlacementTarget свойство родительского ToolTip элемента .

 <Setter Property="Text" Value="{Binding PlacementTarget.(dp:ToolTipAttachedProperty.Texto), RelativeSource={RelativeSource AncestorType={x:Type ToolTip}}}"/>
  

Пожалуйста, также проверьте свой XAML на наличие опечаток. Тип прикрепленных свойств не совпадает с StackPanel и в ToolTip стиле: ToolTipDependencyProperty или ToolTipAttachedProperty ?