在WPF中绑定扩展方法

10

我有一个简单的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 组件上?

基本上:有没有办法将其绑定到扩展方法上?


你可以使用ValueConverter......甚至是自定义的MarkupExtension.....http://social.msdn.microsoft.com/Forums/vstudio/en-US/29ccf3d0-7504-427d-a5ad-a45ae7ca5ab2/accessing-extension-methods-via-data-binding - Colin Smith
3个回答

11

不,您不能将扩展方法绑定到。但是,您可以绑定到 Dog 对象的 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


5

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

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

如果您希望保持 NameNameEx 同步,只需在 Name 属性的 setter 中也为 NameEx 触发 PropertyChanged 事件即可。


4

编程就像是一场逻辑智力游戏。

在WPF中,绑定 MethodName 是不可能的,因为绑定引擎只能使用属性。不过,你可以使用一些技巧。

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

  1. Add an extension method to the get accessor of the property, like this

    private string _name;
    public string Name
    {
        get { return _name.BarkYourName(); }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
    
  2. Add a converter to change the effect of the Name property, like this

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接