将 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
个实例。所有三个 TextBox
es 都应该绑定到同一个 DateTime
实例。在正确的 MVVM 实现中,您应该有一个带有 DateTime
属性 的视图模型,我们称它为 DateInViewModel
:
private DateTime _dateInViewModel;
public DateTime DateInViewModel
{
get { return _dateInViewModel; }
set
{
_dateInViewModel = value;
NotifyPropertyChanged("DateInViewModel");
}
}
视图模型应实现 INotifyPropertyChanged
接口,以便在 属性 发生变化时通知绑定。
您只需在视图模型中设置 DateInViewModel
,而不是将 SDate2
的 Text
设置为那个 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
,以便在编辑时查看即时更新。 TextBox
的 Text
绑定的默认 UpdateSourceTrigger
是 LostFocus
,因此仅当您在 TextBox
外部单击时才会通知其他绑定。
我现在有三个文本框:
<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
个实例。所有三个 TextBox
es 都应该绑定到同一个 DateTime
实例。在正确的 MVVM 实现中,您应该有一个带有 DateTime
属性 的视图模型,我们称它为 DateInViewModel
:
private DateTime _dateInViewModel;
public DateTime DateInViewModel
{
get { return _dateInViewModel; }
set
{
_dateInViewModel = value;
NotifyPropertyChanged("DateInViewModel");
}
}
视图模型应实现 INotifyPropertyChanged
接口,以便在 属性 发生变化时通知绑定。
您只需在视图模型中设置 DateInViewModel
,而不是将 SDate2
的 Text
设置为那个 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
,以便在编辑时查看即时更新。 TextBox
的 Text
绑定的默认 UpdateSourceTrigger
是 LostFocus
,因此仅当您在 TextBox
外部单击时才会通知其他绑定。