如何对 XAML 绑定值执行计算:反转、相乘、减去或添加? [英] How perform calculation on a XAML Binding value: reverse it, multiply it, subtract from it or add to it?

查看:47
本文介绍了如何对 XAML 绑定值执行计算:反转、相乘、减去或添加?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

第一;问题是修辞,我有答案!我从这里得到了很多帮助,我想把这个巧妙的技巧还给我.

First; the question is rhetorical, I have an answer! I have gotten so much help from looking here that I wanted to give this neat trick back.

想象一下,您有一个想要绑定的值,但不知何故或有点错误.

Imagine that you have a value that you want to bind to, but it is somehow or somewhat wrong.

  • 我曾想绑定一个值,但当值为 1 时,我需要 0,反之亦然.
  • 曾经有一段时间我想将元素的宽度绑定到父元素的宽度 - 68px.

推荐答案

进入FirstDegreeFunctionConverter:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;

namespace GenericWPF
{
    /// <summary>
    /// Will return a*value + b
    /// </summary>
    public class FirstDegreeFunctionConverter : IValueConverter
    {
        public double A { get; set; }
    public double B { get; set; }

    #region IValueConverter Members

    public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        double a = GetDoubleValue( parameter, A );

        double x = GetDoubleValue( value, 0.0 );

        return ( a * x ) + B;
    }

    public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        double a = GetDoubleValue( parameter, A );

        double y = GetDoubleValue( value, 0.0 );

        return ( y - B ) / a;
    }

    #endregion


    private double GetDoubleValue( object parameter, double defaultValue )
    {
        double a;
        if( parameter != null )
            try
            {
                a = System.Convert.ToDouble( parameter );
            }
            catch
            {
                a = defaultValue;
            }
        else
            a = defaultValue;
        return a;
    }
}

如何使用?

您在资源部分为每次使用制作一个资源:

You make a resource for each use in the resource section:

<GenericWPF:FirstDegreeFunctionConverter x:Key="ReverseOne"
                            A="-1"
                            B="1" />

<Border Opacity="{Binding Path=Opacity
    , ElementName=daOtherField
    , Converter={StaticResource ReverseOne}}" />

<GenericWPF:FirstDegreeFunctionConverter x:Key="ListboxItemWidthToErrorWidth"
     A="1"
     B="-68" />

<TextBox MaxWidth="{Binding Path=ActualWidth
   , Converter={StaticResource ListboxItemWidthToErrorWidth}
   , RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" />

名称来自函数 y = a*x + b(在挪威语中称为一阶函数"),当然也可以将其升级为二阶函数 y= a*x^2+ bx + c,但我还没有找到它的用途.

The name comes from the function y = a*x + b (Called a "first degree function" in Norwegian), and of course it would be possible to upgrade it to a second degree function y= a*x^2 + bx + c, but I haven't found a use for it yet.

我曾遇到过一种情况,我想根据宽度创建列.每次我增加 200 像素的宽度时,我希望容器向我显示另一列.当时我硬编码了一个转换器,但我应该制作一个 y=(a/x) + b 转换器.

I had a situation where I wanted to make columns based on width. Each time I got 200 pixels more width, I wanted the container to show me another column. At that time I hardcoded a converter, but I should have made a y=(a/x) + b converter instead.

现在,我应该给这个转换器取什么名字,这样大家才能明白它是什么?由于我是挪威人,所以我用了我们在学校学到的表达方式,直接翻译过来.请,如果您有任何建议或意见,请告诉我.您想到的任何改进或改进也将不胜感激...

Now, what should I have named this converter so that everybody understand what it is? Since I'm a Norwegian, I used the expression we learned in school, directly translated. Please, if you have a suggestion or an opinion, let me know. Any refinements or improvements you have thought of would also be appreciated...

也许LinearTransformConverter"会更好地传达转换器为您做什么,我会考虑的.还有其他提议吗?托

Maybe "LinearTransformConverter" would better communicate what the converter does for you, I'll think about it. Any other proposals? Tor

这篇关于如何对 XAML 绑定值执行计算:反转、相乘、减去或添加?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆