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