【问题标题】:Demultiplexing using IMultiValueConverter使用 IMultiValueConverter 解复用
【发布时间】:2014-11-20 16:23:21
【问题描述】:

我有一个 DependencyProperty X (String) 和 n DependencyProperties Yi (String),它们都是 String 类型,其中 X 是 Yi 对所有 i 的串联。使用 MultiValueConverter 可以轻松实现。

另一方面,如果 x 发生变化,我想将 x 拆分为块并将每个块(通过一些依赖于块数据值的规则集)分配给其对应的 y_i。

为此,我需要知道 ConvertBack 返回的 Object[] 的哪个索引 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();
    }

以及对应的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

    }

【问题讨论】:

  • 您对IValueConverter 的唯一其他输入是parameter 输入参数,您无法对其进行数据绑定,因此您的选择非常有限。您可能需要重新考虑这种情况...您可以在 ItemsControl (您的 Y 项目)中使用 strings 的集合,这些集合呈现为彼此相邻的 TextBlocks 以给人留下印象他们都在一个TextBlock中。

标签: c# wpf xaml


【解决方案1】:

我找到了一个对我有用的通用(并且有些实用)的解决方案

我在 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。由于 MultiBinding 是 Binding-s 的“集合”,因此可以将 IValueConverter 附加到每个 Binding。每个 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2015-07-27
    • 2011-04-03
    • 2010-12-01
    • 1970-01-01
    • 2023-03-05
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多