2011-01-07 72 views
4

要翻譯我的WPF應用程序,我使用返回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「綁定'不能在'Setter'類型的'Value'屬性上設置。 '綁定'只能在DependencyObject的DependencyProperty上設置。

好吧,這對我有意義。我試圖在我的Resource中定義TextBlock,並在DataTrigger的Setter Value中使用{StaticResource MyResource}。但是,當我這樣做時,我的按鈕的樣式沒有正確應用...

如何使用我的標記擴展名和更改按鈕上的文本而無需destring能夠對按鈕內的字符串進行樣式設置?

回答

7

如果目標(IProvideValueTarget.TargetObject)是一個setter,嘗試返回標記擴展本身(this)。當樣式應用於實際元素時,它將被重新評估。

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

    ... 
} 
+1

謝謝,這個工程! – falstaff 2011-01-07 14:50:25