将3个文本框绑定在一起;相同的DateTime格式不同

时间:2016-02-23 15:24:26

标签: c# wpf datetime data-binding 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"));

这是什么样的:

enter image description here

我想要做的是,如果我编辑一个文本框的任何部分,它应该在相应的部分编辑其他文本框。因此,如果我将第一个文本框中的2016部分更改为2017SDate2就像这样: enter image description here

如果我更改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'}" />

1 个答案:

答案 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; UpdateSourceTriggerPropertyChanged可在您修改时查看即时更新。 UpdateSourceTrigger TextBox绑定的默认TextLostFocus,因此只有在TextBox外部点击时才会通知其他绑定。