Как управлять изменениями текстовых полей при построении сложных финансовых расчетов в WPF - PullRequest
0 голосов
/ 30 октября 2019

Я создаю приложение wpf для некоторых сложных финансовых расчетов с использованием текстового поля. Пример электронной таблицы

Все серые ячейки основаны на формуле.

Я знаю, что могу использовать textbox_textChanges для отслеживания одного изменения текстового поля, я попытался создать какой-то общий метод обмена текстами, подобный приведенному ниже:

    private void Txt_onTextChanged(object sender, TextChangedEventArgs e)
    {
        textbox.Text = int.Parse(!string.IsNullOrEmpty(textbox1.Text) ? textbox1.Text : "0") +
                       int.Parse(!string.IsNullOrEmpty(textbox1.Text) ? textbox1.Text : "0")
    }

Это не работает, так как у меня так многоразные текстовые поля и расчеты. (Когда база интересов изменилась, изменились еще 3 ячейки). Существует ли эффективный способ отслеживания этих изменений и автоматического отражения в другом текстовом поле? Я не хочу создавать text_TextChanges для каждого отдельного текстового поля, и метод расчета не тот.

1 Ответ

0 голосов
/ 07 ноября 2019

Наконец-то я нашел способ реализовать эти функции. Использование конвертера.

   public class AddListRecordsConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            decimal val = 0;
            decimal result = 0;

            foreach (var txt in values)
            {
                if (string.IsNullOrEmpty(txt.ToString())) continue;
                if (decimal.TryParse(txt.ToString(), out val))
                    result += val;
                else
                    return "$0.00";
            }

            return result.ToString();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return null;
        }
    }

public class InterestCalculationRecordsConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            decimal val = 0;
            decimal result = 0;
            List<decimal> convertedLists = new List<decimal>();
            foreach (var txt in values)
            {
                if (string.IsNullOrEmpty(txt.ToString())) return null;
                if (decimal.TryParse(txt.ToString(), out val))
                    //result += val;
                    convertedLists.Add(val);
                else
                    return "$0.00";
            }

            if (convertedLists[0] == 0) return 0;
            result = 1 / convertedLists[0] * convertedLists[1] * convertedLists[2] * convertedLists[3];

            return result.ToString();
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return null;
        }
    }

Xaml похож на ниже.

 <Page.Resources>
        <local:AddListRecordsConverter x:Key="AddListRecordsConverter"></local:AddListRecordsConverter>
        <local:InterestCalculationRecordsConverter x:Key="InterestCalculationRecordsConverter"></local:InterestCalculationRecordsConverter>
 </Page.Resources>

Текстовое поле Xaml похоже на ниже (просто отправьте вычисления int):

<TextBox Grid.Row="7" Grid.Column="2" Name="TxtPostJudgmentInterest" IsEnabled="False">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource InterestCalculationRecordsConverter}">
            <Binding ElementName="TxtYearDays" Path="Text" Mode="OneWay"></Binding>
            <Binding ElementName="TxtDays" Path="Text" Mode="OneWay"></Binding>
            <Binding ElementName="TxtPrincipal" Path="Text" Mode="OneWay"></Binding>
            <Binding ElementName="TxtInt" Path="Text" Mode="OneWay"></Binding>
        </MultiBinding>
    </TextBox.Text>
</TextBox>
...