2013-08-28 120 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 + "!!!"; 
        } 
    }