Как заставить TextBox слушать INotifyPropertyChanged - PullRequest
0 голосов
/ 01 января 2019

Я гуглил в течение нескольких часов, но не нашел решения, которое смог понять (я очень плохо знаком с ООП и C # ...).

Задача под рукой такова:

  • У меня есть класс "DutyDay", который имеет свойство "ActualShowTime", которое является объектом DateTime.
  • TextBox с именем "textBoxLegalFDP".
  • метод "CalculateLegalFDP"в котором «ActualShowTime» будет получен через серию вычислений на основе различных других переменных.

Теперь, когда свойство «ActualShowTime» в классе «DutyDay» было изменено, TextBox »textBoxLegalFDP "должен прослушать это изменение, принять обновленное значение" ActualShowTime ", отправить его через" CalculateLegalFDP "и затем поместить новый вычисленный результат в свойство" textBoxLegalFDP.Text ", которое будет показано в TextBox.

Это то, что я сделал до сих пор:

namespace DutyTimeRechner
{
public class DutyDay : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private DateTime _actualShowTime;
    public DateTime ActualShowTime
    {
        get
        {
            return _actualShowTime;
        }
        set
        {
            if (!_actualShowTime.Equals(value))
            {
                _actualShowTime = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ActualShowTime"));
            }
        }
    }

 }

Я надеюсь, что пока это было правильно, согласно тому, что я нашел в Интернете.

Я не включил метод«CalculateLegalFDP ", поскольку здесь это не имеет особого значения.

Какой код мне нужно написать, чтобы TextBox прослушивал изменение свойства и передавал его" CalculateLegalFDP "и собственное обновлениеСвойство «Текст»?

Я думал о чем-то простом, например:

textBoxLegalFDP.AddHandler.OnPropertyChanged = PropertyChangedEventHandler(object sender, "ActualShowTime");

Но уже взглянув на него сам, я знаю его дерьмо, и Visual Studio был еще менее доволен этим подходом, но только чтобы вы знали, какое решение я имею в виду!

PS: Мое мышление действительно имеет смысл?Или есть лучший способ решить все это?

Редактировать: вот код XAML, после того, как я поместил в него DataContext (только соответствующие части):

<Window x:Class="DutyTimeRechner.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DutyTimeRechner"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="Tour Details" Height="450" Width="1000" ResizeMode="NoResize">

<Window.Resources>
    <local:DutyDay x:Key="DutyTimeRechner" />
</Window.Resources>

<StackPanel DataContext="{StaticResource DutyTimeRechner}" Orientation="Horizontal">

и:

<TextBox x:Name="textBoxActualFDP" Text="{Binding ActualShowTime, UpdateSourceTrigger=PropertyChanged}" Margin="2" Height="26" FontSize="16" TextAlignment="Center" MaxWidth="50" Width="43"/>

Но это не сработало, оно просто дает мне стандартное значение даты "01.01.0001 12:00:00 AM" в текстовом поле, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вам нужно ValueConverter

Что вам нужно сделать, это привязать ваш TextBox к значению, как вы это сделали

<TextBox Text="{Binding ActualShowTime, UpdateSourceTrigger=PropertyChanged}"...

Но мы ValueConverter, чтобы изменить отображаемое значение.Это будет выглядеть примерно так:

public class CalculateLegalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        // convert the value in your viewmodel for display
        return CalculateLegalFDP(value);
    }
......

Затем подключите этот конвертер к вашей привязке:

1) добавьте в качестве ресурса:

<Page.Resources>
    <local:CalculateLegalConverter x:Key="LegalConverter"/>
</Page.Resources>

2) Добавитьк вашему обязательному выражению:

<TextBox Text="{Binding ActualShowTime, UpdateSourceTrigger=PropertyChanged, 
Converter={StaticResource LegalConverter}}"...
0 голосов
/ 01 января 2019

Читайте о WPF MVVM :).

Чтобы решить вашу проблему, вам нужно добавить привязку к вашему элементу управления текстовым полем

<TextBox Text="{Binding ActualShowTime, UpdateSourceTrigger=PropertyChanged}"></TextBox>

Но поскольку тип, который вы пытаетесь связать с текстовым полем, является датой-временем, вам, вероятно, нужно написать конвертерпреобразовать дату и время в строку и строку в дату и время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...