将 3 个文本框绑定在一起;相同的日期时间不同的格式

Binding 3 textboxes together; same DateTime different format

我现在有三个文本框:

<TextBox Name="SDate1"  Text="{Binding Source={x:Static System:DateTime.Now}, Mode=OneWay, StringFormat='MM/dd/yyyy'}"  />
<TextBox Name="SDate2" />
<TextBox Name="STime1" Text="{Binding Source={x:Static System:DateTime.Now}, Mode=OneWay, StringFormat='hh:mm:ss'}" />

在后面的代码中:

SDate2.Text = String.Format("{0},{1}/{2}",
           now.Year,
           now.DayOfYear.ToString("d3"),
           now.ToString("HHmmss"));

这看起来像什么:

我想做的是,如果我编辑一个文本框的任何部分,它也应该在适当的部分编辑其他部分。因此,如果我将第一个文本框中的 2016 部分更改为 2017,则 SDate2 如下所示:

如果我更改 STime 中的 hours/minutes/seconds 这也应该有效,这将更改 SDate2 的最后一部分,反之亦然。

更改 SDate1 中的日期将更改 SDate2 中的 dayOfYear,反之亦然。

实现这样的目标的最佳方法是什么?

编辑:我可以将文本框绑定在一起,但格式没有保留,所有文本框中的文本都是相同的。

编辑 2:这是我试过的 xaml.cs 文件中隐藏的代码。

public partial class TestDate : Window, INotifyPropertyChanged
{      
    private DateTime _dateInViewModel;

    public TestDate()
    {
        InitializeComponent();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }
    public DateTime DateInViewModel
    {

        get { return _dateInViewModel; }
        set
        {
           _dateInViewModel = value;
           OnPropertyChanged(new PropertyChangedEventArgs("DateInViewModel"));
        }
    }
}

这是文本框的更新 XAML:

<TextBox Name="SDate1" Text="{Binding DateInViewModel, StringFormat='MM/dd/yyyy'}" />
<TextBox Name="SDate2" Text="{Binding DateInViewModel}" />
<TextBox Name="STime1" Text="{Binding DateInViewModel, StringFormat='hh:mm:ss'}" />

这不起作用的原因是因为您要绑定到单独的 DateTime 个实例。所有三个 TextBoxes 都应该绑定到同一个 DateTime 实例。在正确的 MVVM 实现中,您应该有一个带有 DateTime 属性 的视图模型,我们称它为 DateInViewModel:

private DateTime _dateInViewModel;
public DateTime DateInViewModel
{
    get { return _dateInViewModel; }
    set
    {
        _dateInViewModel = value;
        NotifyPropertyChanged("DateInViewModel");
    }
}

视图模型应实现 INotifyPropertyChanged 接口,以便在 属性 发生变化时通知绑定。

您只需在视图模型中设置 DateInViewModel,而不是将 SDate2Text 设置为那个 string.Format(...)

DateInViewModel = DateTime.Now;

最后是你的 XAML:

<TextBox Name="SDate1" Text="{Binding DateInViewModel, StringFormat='MM/dd/yyyy'}" />
<TextBox Name="SDate2" Text="{Binding DateInViewModel}" />
<TextBox Name="STime1" Text="{Binding DateInViewModel, StringFormat='hh:mm:ss'}" />

您可以将绑定的 UpdateSourceTrigger 更改为 PropertyChanged,以便在编辑时查看即时更新。 TextBoxText 绑定的默认 UpdateSourceTriggerLostFocus,因此仅当您在 TextBox 外部单击时才会通知其他绑定。