使用 IMultiValueConverter 进行解复用

本文关键字:复用 IMultiValueConverter 使用 | 更新日期: 2023-09-27 18:31:18

我有一个DependencyProperty X(字符串)和n个DependencyProperties Yi(字符串),都是String类型,其中X是Yi对所有i的串联。

另一方面,如果 x 发生变化,我想将 x 拆分为块,并将每个块(通过取决于块的数据值的某些规则集)分配给其相应的y_i。

为此,我需要知道 ConvertBack 返回的对象 [] 的哪个索引 j 连接到y_i。

所以我想知道:我怎样才能获得对源对象的引用,该对象的属性分配了 ConvertBack 中返回的 Object[] 中的第 j 个值

我的转换方法:

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        StringBuilder b = new StringBuilder();
        String cur;
        for (Int32 i = 0; i < values.Length; i++)
        {
            if(String.IsNullOrEmpty(cur = values[i] as String)) continue;
            if (b.Length != 0) b.Append(',');
            b.Append(cur);
        }
        return b.ToString();
    }

和相应的转换回

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        Object[] ret = new Object[targetTypes.Length];
        // How do I know which Source.Property the element
        // ret[i]
        // targets
    }

使用 IMultiValueConverter 进行解复用

我找到了一个对我有用的通用(有点实用)的解决方案

我在IMultiValueConverter中实现了ConvertBack,如下所示

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
    Object[] ret = new Object[targetTypes.Length];
    if(null != (value as String))
        for(Int32 i = 0; i < targetType.Length; i++)
        {
            // Propagate a copy of value to each Binding
            ret[i] = value.ToString();
        }
    return ret;
}

这会将提供的值分配给每个附加的 Yi。由于多重绑定是 Binding-s 的"集合",因此可以将 IValueConverter 附加到每个绑定。每个 IValueConverter 都可以使用有关其附加源的一些信息进行参数化,因此它可以过滤掉不属于附加源的任何块。

附上了一个 IValueConverter 的示例,该转换器使用参数提供的数据来过滤掉值

[ValueConversion(typeof(String), typeof(String))]
public sealed class ParameterFilter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(null == (parameter as String)) return DependencyProperty.UnsetValue;
        if(null == (value as String)) return DependencyProperty.UnsetValue;
        String[] split = value.ToString().Split(',');
        StringBuilder b = new StringBuilder();
        String cur;
        for (Int32 i = 0; i < split.Length; i++)
        {
            if(String.IsNullOrEmpty(cur = split[i])) continue;
            if(!cur.Contains(parameter.ToString()) continue;
            if (b.Length != 0) b.Append(',');
            b.Append(cur);
        }
        return b.ToString();
    }
}