首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于IMultiValueConverter的解复用器

基于IMultiValueConverter的解复用器
EN

Stack Overflow用户
提问于 2014-11-20 16:23:21
回答 1查看 217关注 0票数 1

我有一个DependencyProperty X ( String )和n DependencyProperties Yi (String),它们都是类型字符串,其中X是所有i的连接。使用MultiValueConverter可以很容易地实现这一点。

另一方面,如果x发生变化,我希望将x分割成块,并将每个块(由依赖于块的数据值的规则集)分配给相应的y_i。

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

因此,我想知道:如何获得对源对象的引用,该对象的属性是ConvertBack中返回的ConvertBack中的j-th值。

我的转换方法:

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-21 12:31:16

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

我用ConvertBack实现了IMultiValueConverter,如下所示

代码语言:javascript
复制
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示例,该示例使用参数提供的数据筛选出值。

代码语言:javascript
复制
[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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27044521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档