将XmlDataProvider Source属性绑定到另一种形式的静态函数?

时间:2011-02-16 19:59:25

标签: c# wpf xaml data-binding xmldataprovider

我正在尝试将具有Source属性的XmlDataProvider绑定到另一种形式的静态函数。

这是XmlDataProvider行 -

<XmlDataProvider x:Key="Lang" Source="/lang/english.xml" XPath="Language/MainWindow"/>

我希望将Source属性绑定到一个名为“GetValue_UILanguage”的静态函数,其形式称为:“Settings”

先谢谢了,

锭。

1 个答案:

答案 0 :(得分:1)

有关允许您绑定到方法的转换器,请参阅this question's answer

您可以修改它以便能够访问任何类的静态方法。

编辑:这是一个修改过的转换器,应该通过反射找到方法。

(注意:最好使用markup extension,因为实际上并没有绑定任何值。)

public sealed class StaticMethodToValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            var methodPath = (parameter as string).Split('.');
            if (methodPath.Length < 2) return DependencyProperty.UnsetValue;

            string methodName = methodPath.Last();

            var fullClassPath = new List<string>(methodPath);
            fullClassPath.RemoveAt(methodPath.Length - 1);
            Type targetClass = Assembly.GetExecutingAssembly().GetType(String.Join(".", fullClassPath));

            var methodInfo = targetClass.GetMethod(methodName, new Type[0]);
            if (methodInfo == null)
                return value;
            return methodInfo.Invoke(null, null);
        }
        catch (Exception)
        {
            return DependencyProperty.UnsetValue;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("MethodToValueConverter can only be used for one way conversion.");
    }
}

用法:

<Window.Resources>
    ...
    <local:StaticMethodToValueConverter x:Key="MethodToValueConverter"/>
    ...
</Window.Resources>

...

<ListView ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter=Test.App.GetEmps}">
...

App类中的方法:

namespace Test
{
    public partial class App : Application
    {
        public static Employee[] GetEmps() {...}
    }
}

我对此进行了测试并且它有效,但使用完整的类路径非常重要,仅App.GetEmps就不起作用。