将列筛选器绑定到转换值

本文关键字:转换 绑定 筛选 | 更新日期: 2023-09-27 18:05:10

 So there is a data model with 2 properties: first name and last name.  

我使用自定义转换器来表示此值"姓,名"后面有逻辑,当其中一个属性为null时,转换器返回null。
在这种情况下,我也想要一个列上的teleerik过滤器,但有一个问题,因为不绑定到转换值,而是到原始数据。

是否有任何方法来处理这个问题,并将转换字符串和过滤器绑定到它?

代码xaml/silverlight:

<RadGridView ItemsSource="{Binding PersonCollection}">
<telerik:GridViewDataColumn Header="Name" DataMemberBinding="{Binding Converter={StaticResource FirstLastNameConverter}}" /> 
</RadGridView>

默认teleerik没有显示,因为这里绑定的是整个person对象

和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; }
}

所以问题就用另一种方法解决了。我没有使用转换器,而是使用了teleerik表达式。因此,通过这种方式,对表达式和过滤器进行了原始绑定,可以正常工作。下面是一个例子