【问题标题】:Markup Extension in Data Trigger数据触发器中的标记扩展
【发布时间】:2011-06-05 03:58:54
【问题描述】:

为了翻译我的 WPF 应用程序,我使用了一个返回绑定对象的标记扩展。这允许我在应用程序运行时切换语言。我像这样使用这个标记:

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

这会导致以下异常:

不能在“Setter”类型的“Value”属性上设置“Binding”。 “绑定”只能在 DependencyObject 的 DependencyProperty 上设置。

好的,这对我来说很有意义。我试图在我的资源中定义 TextBlock 并在 DataTrigger 的 Setter 值中使用 {StaticResource MyResource}。但是当我这样做时,我的 Button 的样式没有正确应用......

如何使用我的标记扩展并更改按钮上的文本,而不破坏按钮内字符串样式的能力?

【问题讨论】:

    标签: wpf xaml datatrigger markup-extensions


    【解决方案1】:

    如果目标 (IProvideValueTarget.TargetObject) 是 setter,请尝试返回标记扩展本身 (this)。当样式应用于实际元素时,它将被重新评估。

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        var pvt = service.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
        if (pvt.TargetObject is Setter)
            return this;
    
        ...
    }
    

    【讨论】:

    • 当目标属性的类型为object 时,这很有效,否则 OP 提到的异常又回来了。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2011-06-16
    • 2011-06-05
    • 2019-04-07
    • 2011-04-02
    相关资源
    最近更新 更多