如何使TextBox侦听INotifyPropertyChanged

时间:2019-01-01 17:11:29

标签: c# wpf

我搜索了几个小时,但是没有找到我能理解的解决方案(我对OOP和C#还是很陌生。)

当前的任务是这样:

  • 我有一个类“ DutyDay”,它的属性“ ActualShowTime”是一个DateTime对象。
  • 一个名为“ textBoxLegalFDP”的文本框。
  • 一种“ CalculateLegalFDP”方法,其中“ ActualShowTime”将通过基于各种其他变量的一系列计算获得。

现在,只要更改了“ DutyDay”类中的“ ActualShowTime”属性,文本框“ textBoxLegalFDP”就应侦听该更改,获取“ ActualShowTime”的更新值,通过“ CalculateLegalFDP”将其发送,然后放入新的计算结果“ textBoxLegalFDP.Text”属性中将显示在文本框中。

这是我到目前为止所做的:

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”,并将其更新为自己的“ Text”属性?

我在考虑简单的东西,例如:

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

但是我已经亲自看过它了,我知道它的废话,而Visual Studio对该方法甚至不满意,但是这样您就知道我在想哪种解决方案!

PS:我的想法实际上有意义吗?还是有更好的方法来解决所有这些问题?

编辑:这是XAML代码,在我将DataContext放入其中之后(仅是relevan部分):

<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 :(得分:0)

阅读有关WPF MVVM的信息:)。

要解决您的问题,您需要向文本框控件添加绑定

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

但是由于您要与文本框绑定的类型是日期时间,因此您可能需要编写转换器以将日期时间转换为字符串并将字符串转换为日期时间

答案 1 :(得分:0)

您需要 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}}"...