我有一个DependencyProperty X ( String )和n DependencyProperties Yi (String),它们都是类型字符串,其中X是所有i的连接。使用MultiValueConverter可以很容易地实现这一点。
另一方面,如果x发生变化,我希望将x分割成块,并将每个块(由依赖于块的数据值的规则集)分配给相应的y_i。
为此,我需要知道ConvertBack返回的ConvertBack连接到y_i的哪个索引j。
因此,我想知道:如何获得对源对象的引用,该对象的属性是ConvertBack中返回的ConvertBack中的j-th值。
我的转换方法:
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();
}以及相应的ConvertBack
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
}发布于 2014-11-21 12:31:16
我找到了一个对我有用的通用(而且有点实用)的解决方案。
我用ConvertBack实现了IMultiValueConverter,如下所示
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;
}这就把所提供的价值分配给了每一个附属的彝族。因为MultiBinding是绑定的“集合”,所以可以在每个绑定中附加一个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();
}
}https://stackoverflow.com/questions/27044521
复制相似问题