ValueConverters.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Globalization;
  2. using System.Windows;
  3. using System.Windows.Data;
  4. namespace MeloongCore.Wpf;
  5. /// <summary>
  6. /// 对数据绑定进行加法运算,使用 <paramref name="parameter"/> 决定加数。
  7. /// </summary>
  8. public class AdditionConverter : IValueConverter {
  9. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) {
  10. if (value is null) return 0;
  11. if (!double.TryParse(value.ToString(), out double before)) return 0;
  12. double scale = 1;
  13. if (parameter is not null) double.TryParse(parameter.ToString(), out scale);
  14. return before + scale;
  15. }
  16. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) {
  17. if (value is null) return Binding.DoNothing;
  18. if (!double.TryParse(value.ToString(), out double before)) return Binding.DoNothing;
  19. double scale = 1;
  20. if (parameter is not null) double.TryParse(parameter.ToString(), out scale);
  21. return before - scale;
  22. }
  23. }
  24. /// <summary>
  25. /// 对数据绑定进行乘法运算,使用 <paramref name="parameter"/> 决定乘数。
  26. /// </summary>
  27. public class MultiplicationConverter : IValueConverter {
  28. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) {
  29. if (value is null) return 0;
  30. if (!double.TryParse(value.ToString(), out double before)) return 0;
  31. double scale = 1;
  32. if (parameter is not null) double.TryParse(parameter.ToString(), out scale);
  33. return before * scale;
  34. }
  35. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) {
  36. if (value is null) return Binding.DoNothing;
  37. if (!double.TryParse(value.ToString(), out double before)) return Binding.DoNothing;
  38. double scale = 1;
  39. if (parameter is not null) double.TryParse(parameter.ToString(), out scale);
  40. if (scale == 0) return Binding.DoNothing;
  41. return before / scale;
  42. }
  43. }
  44. /// <summary>
  45. /// 将取反的 <see cref="bool"/> 绑定到 <see cref="Visibility"/>。
  46. /// </summary>
  47. public class InverseBooleanToVisibilityConverter : IValueConverter {
  48. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) {
  49. if (value is null) return Visibility.Visible;
  50. return bool.TryParse(value.ToString(), out bool boolValue) ? (boolValue ? Visibility.Collapsed : Visibility.Visible) : Visibility.Visible;
  51. }
  52. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) {
  53. if (value is null) return false;
  54. return value is Visibility vis && vis != Visibility.Visible;
  55. }
  56. }
  57. /// <summary>
  58. /// 将 <see cref="bool"/> 取反。
  59. /// </summary>
  60. public class InverseBooleanConverter : IValueConverter {
  61. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) {
  62. if (value is null) return false;
  63. return bool.TryParse(value.ToString(), out bool boolValue) ? !boolValue : false;
  64. }
  65. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) {
  66. if (value is null) return false;
  67. return bool.TryParse(value.ToString(), out bool boolValue) ? !boolValue : false;
  68. }
  69. }