Silverlight: как использовать привязку в сеттере для стиля (или эквивалентной работы)

Если человек, который ответил этот вопрос, вы не можете поместить привязку как значение в сеттер в стиле в Silverlight. Какой позор, потому что у меня есть 4 текстовых блока, которые используют ту же самую привязку для своего свойства Opacity. Есть ли в каком-то смысле "стиль" их свойство Opacity, так что все четверо указывают на одно и то же обязательство? В противном случае я должен установить каждое свойство непрозрачности отдельно. В моем случае это еще хуже - все четыре используют другие привязки свойств, а это означает, что каждое объявление TextBlock довольно долгое, и все же все они практически одинаковы (их привязки свойств, то есть). Я знаю, что я мог бы кратко установить все свои общие привязки свойств в кодировке, но мне бы хотелось, чтобы XAML-решение было там.

Спасибо!

Ответы

Ответ 1

Вот как это делается. Вы используете ContentControl и указываете ControlTemplate для него как статический ресурс: -

<Grid.Resources>
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl">
        <TextBlock Opacity="{Binding SomeOpacity}" Text="{TemplateBinding Content}" />
    </ControlTemplate>
<Grid.Resource>
<ContentControl Content="{Binding SomeTextValue}" Template="{StaticResource CommonTextBlock}" />
<ContentControl Content="{Binding SomeOtherTextValue}" Template="{StaticResource CommonTextBlock}" />

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

Этот подход может быть расширен до Style: -

<Grid.Resources>
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl">
        <TextBlock Opacity="{Binding SomeOpacity}" Text="{TemplateBinding Content}" />
    </ControlTemplate>
    <Style x:Key="CommonTextBlockStyle" TargetType="ContentControl">
       <Setter Property="Template" Value="{StaticResource CommonTextBlock}" />
       <Setter Property="Foreground" Value="Blue" />
    </Style>
<Grid.Resource>
<ContentControl Content="{Binding SomeTextValue}" Style="{StaticResource CommonTextBlockStyle}" />
<ContentControl Content="{Binding SomeOtherTextValue}" Style="{StaticResource CommonTextBlockStyle}" />

Ответ 3

В Silverlight: Ну... да, вы не можете сделать привязку. Здесь я использовал статический ресурс (который, вероятно, не будет отвечать вашим потребностям). Это самое близкое, что вы получите без выполнения привязок в коде.

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400"
    Name="this" Tag="0.5">

  <UserControl.Resources>
    <system:Double x:Key="opacity">0.5</system:Double>
    <Style TargetType="TextBlock">
      <Setter Property="Opacity" Value="{StaticResource opacity}"/>
    </Style>
  </UserControl.Resources>
  <StackPanel>
    <TextBlock Text="ABC"/>
    <TextBlock Text="DEF"/>
    <TextBlock Text="GHI"/>
    <TextBlock Text="JKL"/>
  </StackPanel>
</UserControl>

EDIT: Ну, вот он в WPF в любом случае...

Здесь вы в WPF:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        Name="MyWindow" Tag="0.5">
  <Window.Resources>
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="Opacity" Value="{Binding ElementName=MyWindow, Path=Tag}"/>
    </Style>
  </Window.Resources>
  <StackPanel>
    <TextBlock Text="ABC"/>
    <TextBlock Text="DEF"/>
    <TextBlock Text="GHI"/>
    <TextBlock Text="JKL"/>
  </StackPanel>
</Window>

Конечно, вы можете стать намного более креативным, чем это. Кроме того, в зависимости от того, как/когда/где ваши стили определены, иногда проще просто сделать это в коде.