WPF XAML вызывая метод на текущем объекте
-
03-10-2019 - |
Вопрос
Я пытаюсь привязать к выходу метода. Теперь я видел примеры этого, используя ObjectDataProvider
Однако проблема с этим является ObjectDataProvider создает новый экземпляр объекта для вызова метода. Если мне нужен метод, вызываемый на текущем экземпляре объекта. В настоящее время я пытаюсь получить конвертер на работу.
Настраивать:
Class Entity
{
private Dictionary<String, Object> properties;
public object getProperty(string property)
{
//error checking and what not performed here
return this.properties[property];
}
}
Моя попытка XAML
<local:PropertyConverter x:Key="myPropertyConverter"/>
<TextBlock Name="textBox2">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource myPropertyConverter}"
ConverterParameter="Image" >
<Binding Path="RelativeSource.Self" /> <!--this doesnt work-->
</MultiBinding>
</TextBlock.Text>
</TextBlock>
мой код позади
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string param = (string)parameter;
var methodInfo = values[0].GetType().GetMethod("getProperty", new Type[0]);
if (methodInfo == null)
return null;
return methodInfo.Invoke(values[0], new string[] { param });
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException("PropertyConverter can only be used for one way conversion.");
}
Моя проблема в том, что я не могу пройти текущее сущность в преобразователь. Поэтому, когда я пытаюсь использовать отражение, чтобы получить метод GetProperty, мне нечего работать на
Спасибо, Стеф
Решение
Оберните призыв к методу в получении свойства и добавьте его свойство, чтобы любой класс, который является вашим текущим DataContext.
Редактировать: Отвечая на ваш обновленный вопрос.
Если вы пройдете только один параметр на ValueConverter, вам не нужен многовалеконвертер, просто используйте регулярный Valueconverter (реализация Ivalueconverter). Кроме того, почему бы не отбрасывать объект в ValueConverter до дистанции и использовать его непосредственно вместо использования отражения.
Передать текущий datacontext в качестве привязки сделать это: <Binding . />
. Отказ Я предполагаю, что DataContext текстового блока есть объект.
Тем не менее, все это не нужно, если все, что вы хотите сделать, это запустить код перед доступом к списку словаря. Просто используйте свойство индекса вместо этого, вы можете получить Data Data с ним напрямую:
public class Entity
{
private Dictionary<String, Object> properties;
public object this[string property]
{
get
{
//error checking and what not performed here
return properties[property];
}
}
}
<TextBlock Text="{Binding Path=[Image]}" />