绑定到WPF中的扩展方法

时间:2013-08-28 09:28:02

标签: c# wpf binding extension-methods

我在C#中有一个简单的类:

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组件?

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

3 个答案:

答案 0 :(得分:7)

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

要创建转换器,请创建一个实现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

答案 1 :(得分:3)

编程是一种逻辑智商游戏。

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

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

  1. 将扩展方法添加到属性的get访问器中,如此

    private string _name;
    public string Name
    {
        get { return _name.BarkYourName(); }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
    
  2. 添加转换器以更改Name属性的效果,如此

    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 + "!!!";
        }
    }
    

答案 2 :(得分:2)

无法绑定到方法。您可以在Dog类中创建属性,如下所示并绑定到它

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

如果您想让NameNameEx保持同步,只需在PropertyChanged的设置器中为NameEx举起Name - 事件 - 特性。

相关问题