7

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

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

4

3 回答 3

9

不,您不能绑定到扩展方法。您可以绑定到 -object 的Name-propertyDog并使用转换器。

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

于 2013-08-28T09:37:05.463 回答
4

编程是逻辑智商游戏。

在 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 + "!!!";
        }
    }
    
于 2013-08-28T10:30:23.903 回答
3

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

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

如果你想保持同步,只需Name在-property的 setter 中引发-event 即可。NameExPropertyChangedNameExName

于 2013-08-28T09:35:10.977 回答