wpf - 数据触发器中的标记扩展

标签 wpf xaml datatrigger markup-extensions

为了翻译我的 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/

相关文章:

wpf - 类型 src :Videogames was not found. 验证您是否缺少程序集引用

wpf - 使用 DataTrigger 将不同的 View 应用到同一个 ViewModel

xaml - 如何检查 xamarin 表单数据触发器中的对象空值?

c# - 将 ObservableCollection 绑定(bind)到 WPF 中的 ComboBox

c# - 评估元素 'System.Windows.Controls.TextBlock' 上的 ThemeStyle 属性时发现循环引用

c# - 如何清除 WPF 列表框?

wpf - 如何在 WPF 中对齐 Canvas 背景?

c# - AvalonDock:多工具窗口布局

.net - 从ListBox SelectedItems属性检索枚举

.net - 如何使用 DataTrigger 覆盖绑定(bind)属性