我需要从翻译管理器中检索TextBlock.Text,例如
<TextBlock Text="{Binding TranslateManager.Translate('word')}" />
我不想为所有文本块设置DataSource。我发现如何做到这一点的唯一方法是绑定到“静态”类并使用converter:
<TextBlock Text="{Binding Value,
Source={StaticResource Translation},
Converter={StaticResource Translation},
ConverterParameter=NewProject}" />
这些助手类
public class TranslationManager : IValueConverter
{
public static string Translate(string word)
{
return translate(word);
}
// this is dummy for fake static binding
public string Value { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var name = parameter as string;
return TranslationManager.Translate(name, name);
}
}
但是,有更好的 - 更短的方式吗?
答案 0 :(得分:3)
我可以通过声明:您应该使用静态资源来翻译单词:Application Resources或*.RESX Files
但是,如果您需要简化xaml,那么您唯一缺少的就是在整个视图中放置一个datacontext。听起来你没有使用MVVM,所以将这个逻辑放在构造函数或后面的代码中可以让你通过绑定访问更多的功能:
public MainPage()
{
// Required to initialize variables
InitializeComponent();
// This is the key to simplify your xaml,
// you won't have set the source for individual controls
// unless you want to
DataContext = this;
}
然后,在您的xaml中,您的文本框可以简化为:
<TextBlock Text="{Binding
ConverterParameter=Hi,
Converter={StaticResource Translator}}"/>
我的翻译:
public class Translator : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return "Hola!";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return "Hi!";
}
}
答案 1 :(得分:0)
是的,Silverlight目前缺少的一件大事就是支持其他标记扩展 - x:静态是其中一个更痛苦的扩展。
你现在正在做的是一种方式,毫无疑问。人们尝试了各种解决方法:
Using static objects in XAML that were created in code in Silverlight
但我还没有找到一种“干净”的方式。至少不像“{x:Static MyStaticClass.Member}”那样干净。