#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
?