将列过滤器绑定到转换后的值
Binding column filter to converted value
So there is a data model with 2 properties: first name and last name.
我正在使用自定义转换器来显示此值
"last name, first name" 背后的逻辑是,只要其中一个属性为 null,转换器 returns null。
在这种情况下,我还想在列上使用 telerik 过滤器,但存在一个问题,因为不绑定到转换后的值而是绑定到原始数据。
有什么办法可以解决这个问题,并同时转换字符串和绑定到它的过滤器吗?
代码如下 xaml/silverlight:
<RadGridView ItemsSource="{Binding PersonCollection}">
<telerik:GridViewDataColumn Header="Name" DataMemberBinding="{Binding Converter={StaticResource FirstLastNameConverter}}" />
</RadGridView>
未显示默认的 telerik,因为此处绑定的是整个人对象
和 Person 模型(不能更改它或对其进行包装):
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
您可以使用转换器将每个项目包装成自定义 PersonWrapper
类型:
<RadGridView ItemsSource="{Binding PersonCollection,
Converter={StaticResource ItemWrappingConverter}}">...</...>
和代码
public class ItemWrappingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object param, CultureInfo cultur)
{
var persons = value as IEnumerable<Person>;
if (persons == null) return null;
return persons.Select(person => new PersonWrapper()
{
Person = person,
FullName = GetFullName(person.FirstName, person.LastName)
} );
}
public object ConvertBack(object value, Type targetT, object param, CultureInfo culture)
{ throw new NotSupportedException(); }
}
public class PersonWrapper
{
public Person Person { get; set; }
public string FullName { get; set; }
}
所以问题用另一种方式解决了。我没有使用转换器,而是使用了 telerik 表达式。因此,通过这种方式可以对表达式进行原始绑定,并且过滤器可以正常工作。这是 example.
So there is a data model with 2 properties: first name and last name.
我正在使用自定义转换器来显示此值
"last name, first name" 背后的逻辑是,只要其中一个属性为 null,转换器 returns null。
在这种情况下,我还想在列上使用 telerik 过滤器,但存在一个问题,因为不绑定到转换后的值而是绑定到原始数据。
有什么办法可以解决这个问题,并同时转换字符串和绑定到它的过滤器吗?
代码如下 xaml/silverlight:
<RadGridView ItemsSource="{Binding PersonCollection}">
<telerik:GridViewDataColumn Header="Name" DataMemberBinding="{Binding Converter={StaticResource FirstLastNameConverter}}" />
</RadGridView>
未显示默认的 telerik,因为此处绑定的是整个人对象
和 Person 模型(不能更改它或对其进行包装):
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
您可以使用转换器将每个项目包装成自定义 PersonWrapper
类型:
<RadGridView ItemsSource="{Binding PersonCollection,
Converter={StaticResource ItemWrappingConverter}}">...</...>
和代码
public class ItemWrappingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object param, CultureInfo cultur)
{
var persons = value as IEnumerable<Person>;
if (persons == null) return null;
return persons.Select(person => new PersonWrapper()
{
Person = person,
FullName = GetFullName(person.FirstName, person.LastName)
} );
}
public object ConvertBack(object value, Type targetT, object param, CultureInfo culture)
{ throw new NotSupportedException(); }
}
public class PersonWrapper
{
public Person Person { get; set; }
public string FullName { get; set; }
}
所以问题用另一种方式解决了。我没有使用转换器,而是使用了 telerik 表达式。因此,通过这种方式可以对表达式进行原始绑定,并且过滤器可以正常工作。这是 example.