如何对 XAML 绑定值执行计算:反转、相乘、减去或添加? [英] How perform calculation on a XAML Binding value: reverse it, multiply it, subtract from it or add to it?
问题描述
第一;问题是修辞,我有答案!我从这里得到了很多帮助,我想把这个巧妙的技巧还给我.
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屋!