2013-08-28 117 views
4

扩展方法我在C#中的简单类:绑定到WPF

public class Dog { 
    public int Age {get; set;} 
    public string Name {get; set;} 
} 

,我创建了一个这样的扩展方法:

public static class DogExt { 
    public static string BarkYourName(this Dog dog) { 
     return dog.Name + "!!!"; 
    } 
} 

有什么办法如何绑定的结果BarkYourName方法到wpf组件?

基本上有什么办法可以将它绑定到扩展方法吗?

+0

你可以使用ValueConverter ....也许甚至是自定义的MarkupExtension ..... http://social.msdn.microsoft.com/Forums/vstudio/en-US/29ccf3d0-7504-427d-a5ad-a45ae7ca5ab2 /访问扩展的方法,通过数据结合 –

回答

6

不,你不能绑定到扩展方法。您可以绑定到Dog -object的Name属性,然后使用转换器。

要创建一个转换器创建一个类实现IValueConverter接口。您只需要单向转换(从模型到视图),因此只需要实现Convert方法。您的转换器不支持ConvertBack方法,因此会抛出NotSupportedException

public class NameToBarkConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var dog = value as Dog; 
     if (dog != null) 
     { 
      return dog.BarkYourName(); 
     } 
     return value.ToString(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

然后你可以使用你的转换器如下:

<Grid> 
    <Grid.Resources> 
     <NameToBarkConverter x:Key="NameToBarkConverter" /> 
    </Grid.Resources> 
    <TextBlock Text="{Binding Name, Converter={StaticResource NameToBarkConverter}}" /> 
</Grid> 

欲了解更多信息,请参阅转换MSDN: IValueConverter

2

没办法绑定到方法。您可以在Dog类创建属性像下面并绑定到它

public string NameEx 
    { 
     get 
     { 
      return this.BarkYourName(); 
     } 
    } 

,如果你想保持Name和同步NameEx,只是提高PropertyChanged -event为NameEx也在Name -property的二传手。

3

编程是逻辑IQ游戏。

因为绑定引擎仅适用于属性,所以在WPF中无法绑定MethodName。虽然,你可以使用一些技巧。

以下是一些实现此目的的方法。

  1. 添加一个扩展方法的get访问的属性,这样

    private string _name; 
    public string Name 
    { 
        get { return _name.BarkYourName(); } 
        set 
        { 
         _name = value; 
         OnPropertyChanged("Name"); 
        } 
    } 
    
  2. 添加一个转换器,以改变名称属性的效果,这样

    public class NameConverter : IValueConverter 
    { 
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         if (value == null) 
          return "!!!"; 
    
         return value.ToString().BarkYourName(); 
        } 
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         throw new NotImplementedException(); 
        } 
    } 
    
    public static class StringExt 
    { 
        public static string BarkYourName(this string str) 
        { 
         return str + "!!!"; 
        } 
    }