Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IMultiValueConverter的解复用_C#_Wpf_Xaml - Fatal编程技术网

C# 使用IMultiValueConverter的解复用

C# 使用IMultiValueConverter的解复用,c#,wpf,xaml,C#,Wpf,Xaml,我有一个dependencProperty X字符串和n个dependencProperties Yi字符串,都是String类型,其中X是Yi对所有I的串联。使用多值转换器可以轻松实现这一点 另一方面,如果x发生变化,我希望将x分割成块,并根据某个规则集将每个块分配给相应的y_I,该规则集取决于块的数据值 为此,我需要知道ConvertBack返回的对象[]的哪个索引j连接到y_I 因此,我想知道:如何获得对源对象的引用,在ConvertBack中,返回对象[]中的第j个值被分配给源对象的属性

我有一个dependencProperty X字符串和n个dependencProperties Yi字符串,都是String类型,其中X是Yi对所有I的串联。使用多值转换器可以轻松实现这一点

另一方面,如果x发生变化,我希望将x分割成块,并根据某个规则集将每个块分配给相应的y_I,该规则集取决于块的数据值

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

因此,我想知道:如何获得对源对象的引用,在ConvertBack中,返回对象[]中的第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();
    }

我找到了一个通用的、有点实用的解决方案,对我很有效

我在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。由于多重绑定是绑定的“集合”,因此可以将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();
    }
}

IValueConverter中唯一的其他输入是参数输入参数,您无法绑定该参数,因此您的选项非常有限。你可能需要重新考虑一下情况。。。您可以在项目中使用字符串集合来控制呈现为文本块的Y项目,这些文本块彼此相邻,给人一种它们都在单个文本块中的印象。
[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();
    }
}