【问题标题】:Silverlight: Binding to static valueSilverlight:绑定到静态值
【发布时间】:2010-04-16 13:15:37
【问题描述】:

我需要从翻译管理器中检索 TextBlock.Text,例如

<TextBlock Text="{Binding TranslateManager.Translate('word')}" />

我不想为所有文本块设置 DataSource。我发现如何做到这一点的唯一方法是绑定到“静态”类并使用转换器:

<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);
  }
 }

但是,有没有更好、更短的方法?

【问题讨论】:

    标签: silverlight silverlight-3.0


    【解决方案1】:

    让我先声明:您应该使用静态资源来翻译单词:Application Resources*.RESX Files

    但是,如果您需要简化 xaml,您唯一缺少的就是在整个视图上放置一个数据上下文。听起来您没有使用 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!";
        }
    }
    

    【讨论】:

      【解决方案2】:

      是的,Silverlight 目前缺少的一大特点是对其他标记扩展的支持 - x:Static 是最痛苦的扩展之一。

      毫无疑问,您现在正在做的是一种方式。人们尝试了多种解决方法:

      http://skysigal.xact-solutions.com/Blog/tabid/427/EntryId/799/Silverlight-DataBinding-to-a-static-resource.aspx

      Using static objects in XAML that were created in code in Silverlight

      但我还没有找到“干净”的方法。至少不像“{x:Static MyStaticClass.Member}”那么干净

      【讨论】:

        猜你喜欢
        • 2014-06-13
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 2014-09-10
        • 2010-10-30
        相关资源
        最近更新 更多