Привязать атрибут источника XmlDataProvider к статической функции в другой форме? - PullRequest
0 голосов
/ 16 февраля 2011

Я пытаюсь привязать XmlDataProvider с атрибутом Source к статической функции в другой форме.

Вот строка XmlDataProvider -

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

Я бы хотел, чтобы его атрибут Source был связанк статической функции с именем: «GetValue_UILanguage» в форме, называемой: «Настройки»

Спасибо заранее,

Din.

1 Ответ

1 голос
/ 16 февраля 2011

См. * ответ этого вопроса для конвертера, который позволяет связывать методы.

Вероятно, вы можете изменить его, чтобы иметь возможность доступа к статическим методам любого класса.

Редактировать: Вот модифицированный конвертер, который должен найти метод через отражение.

(Примечание. Вместо этого лучше использовать расширение разметки , поскольку вы фактически не привязываете какое-либо значение.)

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}">
...

Метод в классе приложения:

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

Я проверил это, и это работает, важно использовать полный путь к классу, хотя, один App.GetEmps не сработал бы.

...