2011-01-07 6 views
4

私のWPFアプリケーションを翻訳するには、Bindingオブジェクトを返すMarkup拡張を使用します。これにより、アプリケーションの実行中に言語を切り替えることができます。私はこのように、このマークアップを使用します。データトリガーのマークアップ拡張子

<TextBlock Text="{t:Translate 'My String'}" />" 

は、私がデータトリガーを通じてボタンのテキストを変更したいと思います:

A「バインディング:これは、次の例外につながる

<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 Valueに{StaticResource MyResource}を使用しようとしました。しかし、私がこれを行うと、私のボタンのスタイルが正しく適用されていません...

ボタン内の文字列のスタイルを変更することなく、マークアップ拡張機能を使ってボタンのテキストを変更するにはどうしたらいいですか?

答えて

7

ターゲット(IProvideValueTarget.TargetObject)がセッターの場合は、マークアップ拡張機能自体(this)を返すようにしてください。スタイルが実際の要素に適用されるときに再評価されます。

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

    ... 
} 
+1

ありがとうございます! – falstaff

+3

これは、targetプロパティの型が 'object'の場合に有効です。それ以外の場合は、OPによって返された例外が戻ります。助言がありますか? –