【问题标题】:Convert Id in ViewModel to ControlTemplate将 ViewModel 中的 Id 转换为 ControlTemplate
【发布时间】:2019-10-06 10:05:56
【问题描述】:

我有一个 wpf ResourceDictionary,它托管了几个或多或少复杂的 xaml“图标”,以及应该托管这些图标的 UserControl。这个想法是在控件的 ViewModel 中有一个整数类型的公共属性 Id。我现在想获取此 Id 属性并将其转换为 ResourceDictionary 条目。我确信这是一个非常标准的用例,但由于某种原因我被卡住了。

这是 UserControl 中的实现

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

        }

有什么方法可以通过这种转换方式分配静态资源吗?

【问题讨论】:

  • 你可以有一个字符串属性IconName,而不是整数属性IconName,它可以保存图标的资源键。然后,在视图中使用Image 并将其Source 属性设置为图标名称。

标签: c# wpf resourcedictionary


【解决方案1】:

我通过 --> 使用 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;
        }
    }
}

为了方便使用,这里是我的 BaseValueConverter 类

/// <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**

【讨论】:

猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2012-08-06
相关资源
最近更新 更多