Silverlight: как использовать привязку в сеттере для стиля (или эквивалентное решение) - PullRequest
14 голосов
/ 02 февраля 2011

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

Спасибо!

Ответы [ 4 ]

11 голосов
/ 03 февраля 2011

Вот как это делается.Вы используете 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}" />
2 голосов
/ 02 февраля 2011

Ознакомьтесь с SetterValueBindingHelper в этой статье блога , а поддержка Binding в установщиках стилей анонсирована для SL5 .

1 голос
/ 02 февраля 2011

В 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>

РЕДАКТИРОВАТЬ: Ну, в любом случае, это в 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>

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

0 голосов
/ 03 февраля 2011

У меня была точно такая же проблема несколько дней назад, и я нашел следующее сообщение в блоге. http://blogs.msdn.com/b/delay/archive/2009/11/02/as-the-platform-evolves-so-do-the-workarounds-better-settervaluebindinghelper-makes-silverlight-setters-better-er.aspx

Работает как шарм.

...