Silverlight: привязка к статическому значению - PullRequest
4 голосов
/ 16 апреля 2010

Мне нужно, чтобы 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);
  }
 }

Но есть ли лучший, более короткий путь?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

Позвольте мне префикс этого, заявив: вы должны использовать статические ресурсы для перевода слов: Ресурсы приложения или *. RESX файлы

Однако, если вам нужно упростить ваш 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!";
    }
}
0 голосов
/ 16 апреля 2010

Да, одна из самых больших вещей, которой в настоящее время не хватает в Silverlight, - это поддержка других расширений разметки - x: Static - одно из самых болезненных.

То, что вы делаете сейчас, это один путь, без сомнения. Люди пробовали различные обходные пути:

http://skysigal.xact -solutions.com / Блог / табетический / 427 / EntryID / 799 / Silverlight-DataBinding к-а-статическому resource.aspx

Использование статических объектов в XAML, созданных в коде в Silverlight

Но я еще не нашел "чистого" пути. По крайней мере, не так чисто, как "{x: Static MyStaticClass.Member}"

...