Расширение разметки в триггере данных - PullRequest
4 голосов
/ 07 января 2011

Для перевода моего приложения 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>

Это приводит к следующему исключению:

Невозможно установить «Binding» в свойстве «Value» типа «Setter». «Привязка» может быть установлена ​​только в свойстве DependencyProperty объекта DependencyObject.

Хорошо, это имеет смысл для меня. Я попытался определить TextBlock в своем ресурсе и использовать {StaticResource MyResource} в качестве значения SetTrigger. Но когда я делаю это, стиль моей кнопки не применяется правильно ...

Как я могу работать с моим расширением разметки и изменять текст на кнопке, не нарушая возможности стилизовать строку внутри кнопки?

1 Ответ

7 голосов
/ 07 января 2011

Попробуйте вернуть само расширение разметки (this), если цель (IProvideValueTarget.TargetObject) является установщиком.Он будет переоценен, когда стиль будет применен к фактическому элементу.

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

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...