33
44namespace MathCore . WPF ;
55
6+ /// <summary>Преобразователь значений для вложенных привязок</summary>
7+ /// <remarks>
8+ /// Этот класс используется внутри <see cref="NestedBinding"/> для обработки дерева вложенных привязок.
9+ /// Преобразователь рекурсивно обходит дерево и применяет соответствующие конвертеры к значениям.
10+ /// </remarks>
11+ /// <example>
12+ /// Этот класс создаётся автоматически при использовании <see cref="NestedBinding"/> и не требует ручного создания.
13+ /// Пример пользовательских конвертеров для использования с вложенными привязками:
14+ /// <code><![CDATA[
15+ /// // Конвертер для объединения строк
16+ /// public class StringConcatConverter : IMultiValueConverter
17+ /// {
18+ /// public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
19+ /// {
20+ /// return string.Join(" ", values.Select(v => v?.ToString() ?? ""));
21+ /// }
22+ ///
23+ /// public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
24+ /// {
25+ /// throw new NotSupportedException();
26+ /// }
27+ /// }
28+ ///
29+ /// // Конвертер для математических операций
30+ /// public class MathConverter : IMultiValueConverter
31+ /// {
32+ /// public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
33+ /// {
34+ /// if (values.Length != 2) return 0;
35+ /// var a = System.Convert.ToDouble(values[0]);
36+ /// var b = System.Convert.ToDouble(values[1]);
37+ /// return a + b;
38+ /// }
39+ ///
40+ /// public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
41+ /// {
42+ /// throw new NotSupportedException();
43+ /// }
44+ /// }
45+ /// ]]></code>
46+ /// Использование в XAML:
47+ /// <code><![CDATA[
48+ /// <TextBlock>
49+ /// <TextBlock.Text>
50+ /// <wpf:NestedBinding Converter="{StaticResource StringConcatConverter}">
51+ /// <Binding Path="FirstName"/>
52+ /// <wpf:NestedBinding Converter="{StaticResource MathConverter}">
53+ /// <Binding Path="Value1"/>
54+ /// <Binding Path="Value2"/>
55+ /// </wpf:NestedBinding>
56+ /// </wpf:NestedBinding>
57+ /// </TextBlock.Text>
58+ /// </TextBlock>
59+ /// ]]></code>
60+ /// В этом примере MathConverter сначала суммирует Value1 и Value2, затем StringConcatConverter объединяет FirstName с результатом суммы.
61+ /// </example>
662public class NestedBindingConverter ( NestedBindingsTree tree ) : IMultiValueConverter
763{
64+ /// <summary>Дерево вложенных привязок</summary>
865 private NestedBindingsTree Tree { get ; } = tree ;
966
67+ /// <summary>Преобразует значения привязок в значение целевого типа</summary>
68+ /// <param name="values">Массив значений, полученных от привязок</param>
69+ /// <param name="TargetType">Целевой тип преобразования</param>
70+ /// <param name="parameter">Параметр преобразователя</param>
71+ /// <param name="culture">Культура для преобразования</param>
72+ /// <returns>Преобразованное значение</returns>
1073 public object ? Convert ( object [ ] ? values , Type TargetType , object ? parameter , CultureInfo culture )
1174 {
1275 var value = GetTreeValue ( Tree , values , TargetType , culture ) ;
1376 return value ;
1477 }
1578
79+ /// <summary>Рекурсивно вычисляет значение для узла дерева вложенных привязок</summary>
80+ /// <param name="tree">Узел дерева вложенных привязок</param>
81+ /// <param name="values">Массив значений, полученных от привязок</param>
82+ /// <param name="TargetType">Целевой тип преобразования</param>
83+ /// <param name="culture">Культура для преобразования</param>
84+ /// <returns>Преобразованное значение для данного узла дерева</returns>
1685 private static object ? GetTreeValue ( NestedBindingsTree tree , object [ ] ? values , Type TargetType , CultureInfo culture )
1786 {
1887 var objects = new object [ tree . Nodes . Count ] ;
@@ -28,5 +97,12 @@ public class NestedBindingConverter(NestedBindingsTree tree) : IMultiValueConver
2897 return value ;
2998 }
3099
100+ /// <summary>Обратное преобразование не поддерживается</summary>
101+ /// <param name="value">Значение для обратного преобразования</param>
102+ /// <param name="TargetTypes">Целевые типы</param>
103+ /// <param name="parameter">Параметр преобразователя</param>
104+ /// <param name="culture">Культура для преобразования</param>
105+ /// <returns>Массив преобразованных значений</returns>
106+ /// <exception cref="NotSupportedException">Обратное преобразование не поддерживается</exception>
31107 public object ? [ ] ? ConvertBack ( object ? value , Type [ ] TargetTypes , object ? parameter , CultureInfo culture ) => throw new NotSupportedException ( ) ;
32108}
0 commit comments