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