2010-04-16 2 views
4

мне нужно TextBlock.Text быть извлечено из менеджера перевода, что-то вродеSilverlight: Привязка к статическому значению

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

Но есть лучше - короче - путь?

ответ

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!"; 
    } 
} 
0

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

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

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

Но я не нашел «чистый» способ еще. По крайней мере, не так чисто, как «{х: Static MyStaticClass.Member}»

Смежные вопросы