単純な算術演算を使用した WPF DataBinding?
-
02-07-2019 - |
質問
受信した境界整数に定数値を追加したいと考えています。実際、同じソース値にバインドしたいが、異なる定数を追加したい場所がいくつかあります。したがって、理想的な解決策は次のようになります...
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=24}"/>
(注記:これはアイデアを示すための例であり、実際のバインド シナリオは TextBox の Canvas プロパティに対するものではありません。しかし、これはアイデアをより明確に示しています)
現時点で私が考えられる唯一の解決策は、多くの異なるソース プロパティを公開し、それぞれが同じ内部値に異なる定数を追加することです。それで、私はこのようなことをすることができます...
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/>
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/>
しかし、将来的には新しい定数に対して新しいプロパティを追加し続ける必要があるかもしれないので、これはかなり厳しいです。また、追加された値を変更する必要がある場合は、ソースオブジェクトを変更する必要がありますが、これはかなり面倒です。
これよりももっと一般的な方法があるはずです?WPF の専門家は何かアイデアを持っていますか?
他のヒント
私は MathConverter
すべての単純な算術演算を行うために作成したものです。コンバーターのコードは次のとおりです ここ 次のように使用できます。
<TextBox Canvas.Top="{Binding SomeValue,
Converter={StaticResource MathConverter},
ConverterParameter=@VALUE+5}" />
次のようなより高度な算術演算でも使用できます。
Width="{Binding ElementName=RootWindow, Path=ActualWidth,
Converter={StaticResource MathConverter},
ConverterParameter=((@VALUE-200)*.3)}"
値コンバータを使用すると、UI にバインドされているソース値を変更できるため、この問題に対する良い解決策になります。
私はいくつかの場所で以下を使用しました。
public class AddValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
object result = value;
int parameterValue;
if (value != null && targetType == typeof(Int32) &&
int.TryParse((string)parameter,
NumberStyles.Integer, culture, out parameterValue))
{
result = (int)value + (int)parameterValue;
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
例
<Setter Property="Grid.ColumnSpan"
Value="{Binding
Path=ColumnDefinitions.Count,
RelativeSource={RelativeSource AncestorType=Grid},
Converter={StaticResource addValueConverter},
ConverterParameter=1}"
/>
WPF を使用したことはありませんが、考えられる解決策はあります。
バインディング パスをマップにマッピングできますか?そうであれば、引数 (キー) を受け取ることができるはずです。Map インターフェイスを実装するクラスを作成する必要がありますが、実際にはキーに追加して "Map" を初期化した基本値を返すだけです。
public Integer get( Integer key ) { return baseInt + key; } // or some such
タグから数値を渡す機能がなければ、元の値とは異なるデルタをどのようにして返すのかわかりません。