使用 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中实现了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();
}
}