【问题标题】:WPF Datagrid IValueConverter ConvertBack Object of own classWPF Datagrid IValueConverter ConvertBack 自身类的对象
【发布时间】:2016-05-29 10:41:16
【问题描述】:

对不起,我的英语不好。

在 XAML 上,我通过 Datagridtextcolumn 中的转换器绑定了我自己的类“参数”的对象。

XAML

<DataGridTextColumn Header="Min" Width="50" Binding="{Binding Path=., Converter={StaticResource MinMaxValueConverter}}">

C#

public class MinMaxValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Parameter p = (Parameter)value;
        if (p.Typ == Parameter.ParameterTyp.k1000) return p.LowerBorder;
        else return p.LowerBorder.ToString("X4") + "h";

    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        ...
        return parameter;
    }
}

我不知道如何编写 CovertBack。 ConvertBack 被认为可以替换对象“参数”的变量中的值而不更改其他变量或删除。但是如果不引用这个对象,我怎么能做到这一点呢? 我尝试将Object绑定到ConverterParameter,但它不起作用。

我需要“Parameter.Typ”的值来知道如何将它转换回来。一个想法是使用“Parameter.Typ”和“Parameter.LowerBurder”进行多重绑定,但我无法在不知道实际行中的 Typ 的情况下转换 Back。

让我意识到我所有的错误!!!

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案1】:

    一般来说:ConvertBack() 方法需要接受存储在绑定目标中的当前值,并将其转换回绑定源所需的类型。

    很遗憾,您没有提供一个很好的Minimal, Complete, and Verifiable example 来清楚地显示您在做什么。除非您这样做,否则不可能提供保证解决您的具体问题的答案。但是根据您提供的信息,可以提出一些基本的观察和建议:

    1. 首先,您的Convert() 方法似乎有两种基本模式:如果源值具有Typ 属性,其值为k1000,那么您直接返回LowerBorder 属性值。否则,将LowerBorder 属性值格式化为字符串(显然是十六进制值)并返回。
    2. 由于您在某些情况下将LowerBorder 值格式化为十六进制字符串,因此假设此属性具有整数类型似乎是合理的,例如int
    3. 要转换回来,您需要能够区分这两种情况,并反转转换。您已实施的转换会导致目标值的最明显差异是尾随 h 字符,它会在一种情况下出现,而在另一种情况下不会出现。所以,让我们使用它。

    在这种情况下,您可以将ConvertFrom() 方法写成这样:

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string text = (string)value;
    
        return text[text.Length - 1] == 'h' ?
            return FromHexString(text) :
            return FromInt32(text);
    }
    

    地点:

    Parameter FromHexString(string text)
    {
        Parameter parameter = new Parameter();
    
        parameter.Typ = Parameter.ParamaterTyp.k1001;
        parameter.LowerBorder = int.Parse(
            text.Substring(0, text.Length - 1), NumberStyles.AllowHexSpecifier);
    }
    
    
    Parameter FromInt32(string text)
    {
        Parameter parameter = new Parameter();
    
        parameter.Typ = Parameter.ParamaterTyp.k1000;
        parameter.LowerBorder = int.Parse(text);
    }
    

    注意:我不知道当值是十六进制时Typ 的值应该是什么,所以为了示例的目的,我只是编了一个新的值名称k1001。事实上,如果可能有多个Typ 值,您将不得不判断要使用的Typ 值,或者您必须更改源到目标的转换,以便该信息被保留(例如,根据Typ 值使用不同的尾随字符)。

    如果以上内容不足以让您了解 ConvertBack() 方法需要做什么,并实现该方法以满足您的需求,请改进您的问题,使其包含一个好的代码示例和具体细节至于代码在每种情况下应该做什么。

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2016-02-12
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多