Привязать атрибут источника XmlDataProvider к статической функции в другой форме?
Я пытаюсь привязать XmlDataProvider с атрибутом Source к статической функции в другой форме.
Вот строка XmlDataProvider -
<XmlDataProvider x:Key="Lang" Source="/lang/english.xml" XPath="Language/MainWindow"/>
Я хотел бы, чтобы его атрибут Source был связан со статической функцией с именем: "GetValue_UILanguage" в форме с именем: "Настройки"
Заранее спасибо,
Дин.
1 ответ
Смотрите ответ на этот вопрос для конвертера, который позволяет вам связывать с методами.
Вероятно, вы можете изменить его, чтобы иметь возможность доступа к статическим методам любого класса.
Изменить: вот модифицированный конвертер, который должен найти метод с помощью отражения.
(Примечание. Вместо этого лучше использовать расширение разметки, поскольку на самом деле вы не привязываете какое-либо значение.)
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
один не работал бы.