将 ViewModel 中的 Id 转换为 ControlTemplate
Convert Id in ViewModel to ControlTemplate
我有一个 wpf ResourceDictionary,它包含几个或多或少复杂的 xaml "icons",以及应该包含这些图标的 UserControl。想法是在控件的 ViewModel 中有一个 public 属性 整数类型的 Id。我现在想使用此 Id 属性 并将其转换为 ResourceDictionary 条目。我确信这是一个非常标准的用例,但出于某种原因我被卡住了。
这是用户控件中的实现
<Border Margin="4" Grid.Row="0"
BorderBrush="{StaticResource EyGrayTint1Brush}"
BorderThickness="0.5">
<Viewbox>
<!--Template="{StaticResource WelcomeIcon}"-->
<ContentControl Template="{Binding Id, Converter={local:IdToIconConverter}}"
Margin="20"/>
</Viewbox>
</Border>
这是转换器
public class IdToIconConverter : BaseValueConverter<IdToIconConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Here I would like to do the conversion
switch ((int)value)
{
case 1:
return null;
case 2:
return null;
default:
Debugger.Break();
return null;
}
}
有什么方法可以通过这种转换方法分配静态资源吗?
我找到了一个解决方案 --> 使用 Application.Current.Resources["ResourceKey"]
资源合并到 App.xaml
public class IdToIconConverter : BaseValueConverter<IdToIconConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ControlTemplate controlTemplate = new ControlTemplate();
switch ((int)value)
{
case 1:
controlTemplate = (ControlTemplate)Application.Current.Resources["WelcomeIcon"];
return controlTemplate;
default:
//Debugger.Break();
return null;
}
}
}
为了方便使用,这里是我的BaseValueConverterclass
/// <summary>
/// A base value converter that allows direct XAML usage
/// </summary>
/// <typeparam name="T">The type of this value converter</typeparam>
public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter
where T : class, new()
{
#region Private Members
/// <summary>
/// A single static instance of this value converter
/// </summary>
private static T mConverter = null;
#endregion
#region Markup Extension Methods
/// <summary>
/// Provides a static instance of the value converter
/// </summary>
/// <param name="serviceProvider">The service provider</param>
/// <returns></returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
return mConverter ?? (mConverter = new T());
}
#endregion
#region Value Converter Methods
/// <summary>
/// The method to convert one type to another
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
/// <summary>
/// The method to convert a value back to it's source type
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public abstract object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
#endregion
** 希望这对其他人有帮助。 bg**
我有一个 wpf ResourceDictionary,它包含几个或多或少复杂的 xaml "icons",以及应该包含这些图标的 UserControl。想法是在控件的 ViewModel 中有一个 public 属性 整数类型的 Id。我现在想使用此 Id 属性 并将其转换为 ResourceDictionary 条目。我确信这是一个非常标准的用例,但出于某种原因我被卡住了。
这是用户控件中的实现
<Border Margin="4" Grid.Row="0"
BorderBrush="{StaticResource EyGrayTint1Brush}"
BorderThickness="0.5">
<Viewbox>
<!--Template="{StaticResource WelcomeIcon}"-->
<ContentControl Template="{Binding Id, Converter={local:IdToIconConverter}}"
Margin="20"/>
</Viewbox>
</Border>
这是转换器
public class IdToIconConverter : BaseValueConverter<IdToIconConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Here I would like to do the conversion
switch ((int)value)
{
case 1:
return null;
case 2:
return null;
default:
Debugger.Break();
return null;
}
}
有什么方法可以通过这种转换方法分配静态资源吗?
我找到了一个解决方案 --> 使用 Application.Current.Resources["ResourceKey"] 资源合并到 App.xaml
public class IdToIconConverter : BaseValueConverter<IdToIconConverter>
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ControlTemplate controlTemplate = new ControlTemplate();
switch ((int)value)
{
case 1:
controlTemplate = (ControlTemplate)Application.Current.Resources["WelcomeIcon"];
return controlTemplate;
default:
//Debugger.Break();
return null;
}
}
}
为了方便使用,这里是我的BaseValueConverterclass
/// <summary>
/// A base value converter that allows direct XAML usage
/// </summary>
/// <typeparam name="T">The type of this value converter</typeparam>
public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter
where T : class, new()
{
#region Private Members
/// <summary>
/// A single static instance of this value converter
/// </summary>
private static T mConverter = null;
#endregion
#region Markup Extension Methods
/// <summary>
/// Provides a static instance of the value converter
/// </summary>
/// <param name="serviceProvider">The service provider</param>
/// <returns></returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
return mConverter ?? (mConverter = new T());
}
#endregion
#region Value Converter Methods
/// <summary>
/// The method to convert one type to another
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
/// <summary>
/// The method to convert a value back to it's source type
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public abstract object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
#endregion
** 希望这对其他人有帮助。 bg**