我在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组件?
基本上:有什么方法可以将它绑定到扩展方法?
答案 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进行绑定,因为绑定引擎仅适用于“属性”。虽然,你可以使用一些技巧。
以下是实现此目的的一些方法。
将扩展方法添加到属性的get
访问器中,如此
private string _name;
public string Name
{
get { return _name.BarkYourName(); }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
添加转换器以更改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();
}
}
如果您想让Name
和NameEx
保持同步,只需在PropertyChanged
的设置器中为NameEx
举起Name
- 事件 - 特性。