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}" />
Ответ 2
Откажитесь от SetterValueBindingHelper
в этой в блоге и поддержка Binding
в установщиках стилей объявлено для SL5.
Ответ 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>
Конечно, вы можете стать намного более креативным, чем это. Кроме того, в зависимости от того, как/когда/где ваши стили определены, иногда проще просто сделать это в коде.
Ответ 4
У меня была такая же проблема несколько дней назад, и я нашел следующий пост в блоге.
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
Он работает как шарм.