wpf xaml, вызывающий метод для текущего объекта - PullRequest
2 голосов
/ 16 сентября 2010

Я пытаюсь привязать к выводу метода. Теперь я видел примеры этого с использованием 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, мне не с чем работать

спасибо, Стеф

1 Ответ

1 голос
/ 16 сентября 2010

Оберните вызов метода внутри свойства get и добавьте это свойство get к любому классу, который является вашим текущим DataContext.

Редактировать: отвечая на ваш обновленный вопрос.

Если вы передаете только один параметр в преобразователь значения, вам не требуется многозначный преобразователь, просто используйте обычный преобразователь значения (реализующий IValueConverter). Кроме того, почему бы не преобразовать объект в преобразователе значений в Distionary и использовать его напрямую вместо отражения.

Чтобы передать текущий текст данных как привязку, сделайте следующее: <Binding . />. Я предполагаю, что текстовый блок данных является текстовым блоком.

Тем не менее, все это не является необходимым, если все, что вам нужно сделать, это запустить некоторый код перед доступом к элементу словаря. Просто используйте вместо этого свойство индекса, вы можете напрямую связать его с данными:

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