Silverlight:如何在 setter 中为样式使用绑定(或等效的解决方法)
Posted
技术标签:
【中文标题】Silverlight:如何在 setter 中为样式使用绑定(或等效的解决方法)【英文标题】:Silverlight: How to use a binding in setter for a style (or an equivalent work around) 【发布时间】:2011-06-20 04:12:52 【问题描述】:如果回答this question 的人是对的,则您不能将绑定作为值放入Silverlight 样式的setter 中。真可惜,因为我有 4 个文本块,它们都对它们的不透明度属性使用完全相同的绑定。无论如何在某种意义上“设计”他们的 Opacity 属性,以便他们四个都指向同一个绑定?否则,我必须单独设置每个 Opacity 属性。就我而言,情况更糟——所有四个都共享其他属性绑定,这意味着每个 TextBlock 声明都非常长,但它们实际上都是相同的(即它们的属性绑定)。我知道我可以在代码隐藏中简洁地设置他们所有的共享属性绑定,但如果有的话,我想要一个 XAML 解决方案。
谢谢!
【问题讨论】:
您可以在 WPF 的样式设置器中应用绑定,所以您只询问 Silverlight 吗? 啊,我没有意识到这一点。我编辑了我的问题,专门说 Silverlight。 【参考方案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" />
【讨论】:
我喜欢这背后的想法,但似乎 TextBlock 没有模板属性。是不是我做错了什么? @JoeCool:抱歉那些TextBlock
元素应该是内容控件。相应地进行了编辑。 (我知道我应该剪切'n'粘贴'n'编辑而不是再次输入代码)。
哦,我肯定在尝试这个。很酷!您是否建议将所有未绑定的属性(例如'Foreground="Blue"')单独保留在一个样式中,而不是将它们也粘贴在控件模板中?你怎么看?【参考方案2】:
在这个blog article 中查看SetterValueBindingHelper
,在样式设置器中支持Binding
是announced for 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>
编辑: 好吧,无论如何它都在 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
它就像一个魅力。
【讨论】:
以上是关于Silverlight:如何在 setter 中为样式使用绑定(或等效的解决方法)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Jackson 中为特定类配置 setter 和 getter 名称约定?
如何在android中为自定义视图创建setter和getter
如何在 v-model 中为基于类的组件使用 getter 和 setter?