Для тех из нас, кто не может использовать конвертер нескольких значений (я смотрю на вас SL4 и WP7 :), благодаря ответу Стивена я нашел способ использовать обычный конвертер значений.
Единственным предположением является то, что значение стиля содержится в свойстве устанавливаемого стиля.
Таким образом, если вы используете шаблон MVVM, то предполагается, что значение стиля (например, TextSmall, TextMedium, TextLarge) является частью модели представления, и все, что вам нужно сделать, это передать параметр преобразователя, определяющий имя стиль.
Например, скажем, у вашей модели вида есть свойство:
public string ProjectNameStyle
{
get { return string.Format("ProjectNameStyle{0}", _displaySize.ToString()); }
}
Стиль применения:
<Application.Resources>
<Style x:Key="ProjectNameStyleSmall" TargetType="TextBlock">
<Setter Property="FontSize" Value="40" />
</Style>
<Style x:Key="ProjectNameStyleMedium" TargetType="TextBlock">
<Setter Property="FontSize" Value="64" />
</Style>
<Style x:Key="ProjectNameStyleLarge" TargetType="TextBlock">
<Setter Property="FontSize" Value="90" />
</Style>
Просмотр XAML:
<TextBlock
Text="{Binding Name}"
Style="{Binding ., Mode=OneWay, Converter={cv:StyleConverter}, ConverterParameter=ProjectNameStyle}">
С вашим классом StyleConverter, реализующим IValueConverter:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType != typeof(Style))
{
throw new InvalidOperationException("The target must be a Style");
}
var styleProperty = parameter as string;
if (value == null || styleProperty == null)
{
return null;
}
string styleValue = value.GetType()
.GetProperty(styleProperty)
.GetValue(value, null)
.ToString();
if (styleValue == null)
{
return null;
}
Style newStyle = (Style)Application.Current.TryFindResource(styleValue);
return newStyle;
}
Обратите внимание, что это код WPF, так как конвертер получен из MarkupExtension, а также из IValueConverter, но он будет работать в SL4 и WP7, если вы используете статический ресурс и добавляете немного больше работы, поскольку метод TryFindResource не есть.
Надеюсь, это кому-нибудь поможет, и еще раз спасибо, Стивен!