wpf xaml调用当前对象的方法

时间:2010-09-15 20:08:02

标签: wpf xaml objectdataprovider

我试图绑定到方法的输出。现在我已经看到了使用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方法时,我无需操作

谢谢,steph

1 个答案:

答案 0 :(得分:1)

在get属性中包含对方法的调用,并将此get属性添加到当前DataContext的任何类中。

编辑:回答您更新的问题。

如果只将一个参数传递给valueconverter,则不需要多值转换器,只需使用常规值转换器(实现IValueConverter)。另外,为什么不将valueconverter中的对象转换为Distionary并直接使用它而不是使用反射。

要将当前的datacontext作为绑定传递:<Binding . />。我猜测文本块的datacontext是实体。

但是,如果你想要做的只是在访问字典项之前运行一些代码,那么所有这些都不是必需的。只需使用索引属性,您可以直接对其进行数据绑定:

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