为了翻译我的 WPF 应用程序,我使用了一个 Markup 扩展,它返回一个 Binding 对象。这允许我在应用程序运行时切换语言。我像这样使用这个标记:
<TextBlock Text="{t:Translate 'My String'}" />"
我想通过数据触发器更改按钮文本:
<Button>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<!-- Custom control template, note the TextBlock formating -->
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="ContentHolder">
<ContentPresenter TextBlock.Foreground="Red" TextBlock.FontWeight="Bold" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<!-- Custom text triggered by Data Binding... -->
<Style.Triggers>
<DataTrigger Binding="{Binding MessageRowButton}" Value="Retry">
<Setter Property="Button.Content" Value="{t:Translate Test}" />
</DataTrigger>
<DataTrigger Binding="{Binding MessageRowButton}" Value="Acknowledge">
<Setter Property="Button.Content" Value="{t:Translate Test}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
这会导致以下异常:
A 'Binding' cannot be set on the 'Value' property of type 'Setter'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
好的,这对我来说很有意义。我试图在我的资源中定义 TextBlock 并使用
{StaticResource MyResource}
在 DataTrigger 的 Setter 值中。但是当我这样做时,我的 Button 样式没有正确应用......如何使用我的标记扩展并更改按钮上的文本,而不会取消设置按钮内字符串样式的能力?
最佳答案
如果目标 ( this
) 是 setter,请尝试返回标记扩展本身 ( IProvideValueTarget.TargetObject
)。当样式应用于实际元素时,它将被重新评估。
public object ProvideValue(IServiceProvider serviceProvider)
{
var pvt = service.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (pvt.TargetObject is Setter)
return this;
...
}
关于wpf - 数据触发器中的标记扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4623907/