数据绑定时将字符串转换为资源

时间:2014-04-27 20:35:01

标签: c# silverlight data-binding windows-phone

我正在开发Windows手机7.5 - 8.0应用。 通常,我需要根据来自数据绑定的值从资源字典中选择一些资源。

首先我这样做了:

public class EventValueConverter: IValueConverter
{
    public delegate object ConvertEventHandler( EventValueConverter sender, object value );

    object IValueConverter.Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        var eh = this.Convert;
        if( null == eh )
        {
            Logger.warning( "EventValueConverter.Convert is not set - returning null." );
            return null;
        }
        return eh( this, value );
    }

    object IValueConverter.ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        throw new NotSupportedException();
    }

    public event ConvertEventHandler Convert;
}

将转换器添加到页面资源中,并在后面的页面代码中实现了事件:

public object myConverter_Convert( EventValueConverter converter, object val )
{
    return this.Resources[ val.ToString() ];
}

效果很好。问题是Blend不喜欢我的转换器,说“错误HRESULT E_FAIL已经从调用COM组件返回”。它在打开页面时发生,并且消息显示在我的页面的位置,从而使Blend无法用于该页面。

然而,我喜欢Blend。这就是为什么我为同样的任务创建了另一个转换器的原因:

public class PageResourceConverter: IValueConverter
{
    object IValueConverter.Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        if( null == value )
            return null;

        string name = value.ToString();
        if( String.IsNullOrEmpty( name ) )
            return null;

        object res = null;
        var page = getCurrentPage();
        if( null == page )
            return null;
        res = page.Resources[ name ];

        if( null == res )
        {
            Logger.warning( "Resource {0} was not found", name );
            return null;
        }
        return res;
    }

    object IValueConverter.ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        throw new NotSupportedException();
    }

    internal static PhoneApplicationPage getCurrentPage()
    {
        if( Global.inFormDesigner ) return null;
        return ( (PhoneApplicationFrame)Application.Current.RootVisual ).Content as PhoneApplicationPage;
    }
}

这也行得通。并且它不会使Blend崩溃。但是,它在设计模式下不起作用,因为Application.Current.RootVisual为null。如何使它在设计模式下工作?

或者,从转换器返回资源的正确方法是什么?我不想为每种类型的枚举+我需要解析为样式或画笔或其他资源的每种字符串ID创建单独的转换器。

0 个答案:

没有答案