我现在有三个文本框:
<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
中的小时/分钟/秒,这将改变SDate2
的最后部分,反之亦然。
更改SDate1
中的日期会更改dayOfYear
中的SDate2
,反之亦然。
实现这样的目标最好的方法是什么?
编辑:我可以将文本框绑定在一起,但不保留格式,并且它在所有文本框中都是相同的文本。
编辑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'}" />
答案 0 :(得分:4)
这不起作用的原因是因为您绑定到单独的DateTime
实例。所有三个TextBox
es都应绑定到同一个DateTime
实例。在适当的MVVM实现中,您应该有一个具有DateTime
属性的viewmodel,我们可以将其称为DateInViewModel
:
private DateTime _dateInViewModel;
public DateTime DateInViewModel
{
get { return _dateInViewModel; }
set
{
_dateInViewModel = value;
NotifyPropertyChanged("DateInViewModel");
}
}
viewmodel应该实现INotifyPropertyChanged
接口,因此当属性发生变化时会通知绑定。
而不是将SDate2
Text
设置为string.Format(...)
,而只是在视图模型中设置DateInViewModel
:
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'}" />
您可以更改绑定&#39; UpdateSourceTrigger
至PropertyChanged
可在您修改时查看即时更新。 UpdateSourceTrigger
TextBox
绑定的默认Text
为LostFocus
,因此只有在TextBox
外部点击时才会通知其他绑定。