2012-03-14 18 views
1

ウォーターマークをWPFアプリケーションに追加する必要があり、そのためにはthis watermark serviceを使用しています。ウォーターマークのTextBox.Textをバインドしてローカライズするプロパティ

これは期待どおりに動作しますが、透かしとして表示されたテキストをローカライズする必要があり、その方法を見つけることができません。

私のXAML宣言:

<TextBox 
    Text="{Binding Name, Mode=TwoWay}"> 
    <Watermark:WatermarkService.Watermark> 
     <TextBlock 
      Text="{Binding <What-goes-here?>}" 
     /> 
    </Watermark:WatermarkService.Watermark> 
</TextBox> 

私のViewModel:

public class PersonViewModel 
{ 
    public string Name {get;set;} 

    public string NameWatermark {get;set;} 
} 

THW次の行では動作しません:

Text="{Binding NameWatermark}" 

<Window x:Name="ThisWindow" 
... 
Text="{Binding Path=NameWatermark, 
       ElementName=ThisWindow}" 

は、それを達成する方法はありますか?

ありがとうございます、ありがとうございます。

答えて

0

WatermarkServiceは静的クラスであり、依存関係オブジェクトではないため、DataContextをそのコンテンツに適切に継承しないという問題があると思います。

最初は本当にViewModelにバインドする必要がありますか?私はあなたのUIのより多くの部分をローカライズしたいと思うので、このものを専用のサービスに移すことはオプションになります。このような

何か:ローカライズのための

<Watermark:WatermarkService.Watermark> 
    <TextBlock Text="{Binding Source={x:Static Watermark:LocalizationService.Instance}, Path=[123],FallbackValue='No LocalizationService found'}"/> 
</Watermark:WatermarkService.Watermark> 

シングルトンクラス:

private static volatile LocalizationService _instance; 
    private static object syncRoot = new Object(); 

    public static LocalizationService Instance 
    { 
     get 
     { 
     if (_instance == null) 
     { 
      lock (syncRoot) 
      { 
      if (_instance == null) 
       _instance = new LocalizationService(); 
      } 
     } 

     return _instance; 
     } 
    } 

    public string this[int id] 
    { 
     get 
     { 
     // do localization stuff here ... 
     return "Localized Value " + id; 
     } 
    } 
    } 

あなたは本当にあなたがたObjectDataProviderにViewModelに割り当てることにより、次の回避策を使用することができ、ウィンドウのDataContextのにバインドしたい場合あなたのバインディングにアクセスしてください:

<Grid Loaded="Grid_Loaded"> 
    <Grid.Resources> 
     <ObjectDataProvider x:Key="PersonViewModelProvider" ObjectInstance="{x:Null}" IsAsynchronous="True"/> 
    </Grid.Resources> 
    <TextBox Text="{Binding Name, Mode=TwoWay}"> 
     <Watermark:WatermarkService.Watermark> 
     <TextBlock Text="{Binding Source={StaticResource PersonViewModelProvider}, Path=NameWatermark}"/> 
     </Watermark:WatermarkService.Watermark> 
    </TextBox> 
    </Grid> 

背後にあるコード:

private void Grid_Loaded(object sender, System.Windows.RoutedEventArgs e) 
{ 
    var panel = sender as Panel; 
    if (panel != null) 
    { 
    var objDataProvider = panel.Resources["PersonViewModelProvider"] as ObjectDataProvider; 
    objDataProvider.ObjectInstance = panel.DataContext; 
    } 
} 
+0

ご回答ありがとうございます。私は現在、WPFでローカライズするためにこのライブラリを使用しています:http://www.codeproject.com/Articles/249369/Advanced-WPF-Localization、しかし、私はそれを使用してローカライズする方法が見つかりません。そのため、私はViewModel(Resources.resxファイルからWatermarkの値を取得しています)にバインドしています。おそらく、私は最初のオプションを適用するためにLocExtensionクラスを適応させることができます。 – JoanComasFdz

1

私はこの質問は古代で実現するが、Googleの時間旅行者のために、私は正確に同じ問題がヒットし、透かし要素を表示/非表示にするMultiDataTriggerを使用して、それを解決しました。これは、元のようにadorner内に要素を埋め込んでいないために機能しますWatermark:WatermarkService.Watermarkです。

<Grid> 
    <TextBox x:Name="messageBox" Text="{Binding Message, UpdateSourceTrigger=PropertyChanged}" Padding="5"> 
     <TextBox.InputBindings> 
      <KeyBinding Key="Enter" Command="{Binding SendMessageCommand}"/> 
     </TextBox.InputBindings> 
    </TextBox> 
    <TextBlock Text="{text:Translate Key=WriteMessageWatermark}" IsHitTestVisible="False" Foreground="LightGray" Margin="7,6,0,0"> 
     <TextBlock.Style> 
      <Style TargetType="TextBlock"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
       <Style.Triggers> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding ElementName=messageBox, Path=Text.IsEmpty}" Value="True" /> 
          <Condition Binding="{Binding ElementName=messageBox, Path=IsFocused}" Value="False" /> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="Visibility" Value="Visible" /> 
        </MultiDataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</Grid> 
関連する問題