我创建了一个DatesClass,从中获取Date数据,该数据存储在使用{{1}的Microsoft SQL Server localdb数据库中的字符串中(由于某种原因-我知道我刚可以使用DateTime)。 }:
System.Data.Linq.Mapping
(我将它们全部设为私有,因为我不希望任何人都在包括我在内的班级之外直接访问它们)
但是,我列出了一个将它们全部封装的列表。像这样:
[Column(CanBeNull = false)]
private string FirstDate { get; set; } = string.Empty;
[Column(CanBeNull = false)]
private string SecondDate { get; set; } = string.Empty;
[Column(CanBeNull = false)]
private string ThirdDate { get; set; } = string.Empty;
然后制定了一种将日期添加到列表的方法:
private List<DateTime> _dates;
public List<DateTime> Dates {
get {
var f = DateTime.TryParse(FirstDate, out var first);
var s = DateTime.TryParse(SecondDate, out var second);
var t = DateTime.TryParse(ThirdDate, out var third);
var list = new List<DateTime>();
if (f) list.Add(first);
if (s) list.Add(second);
if (t) list.Add(third);
if (_dates != null) return list;
_dates = list;
return list;
}
private set {
FirstDate = value[0].ToShortDateString();
SecondDate = value[1].ToShortDateString();
ThirdDate = value[2].ToShortDateString();
}
}
然后保存所有内容:
public void AddDate(DateTime date) {
if (_dates == null) // this was added because some parts of `Dates` getter didn't work for some reason
_dates = Dates;
if (_dates.Count == 3)
throw new ManyDatesException(); // custom exception
if (_dates.Contains(date))
return;
_dates.Add(date);
}
然后我将通过WPF中的各种事件和按钮来进行逻辑处理:
public void SaveDates() {
// this saves data of `_dates` to the private fields using the setter of `Dates`
Dates = _dates;
}
但是我遇到了一系列严重问题,其中一些是:
private void AddDates_Click(object sender, RoutedEventArgs e) {
var date = IDatePicker.SelectedDate ?? IDatePicker.DisplayDate;
var datesClass = DatesProvider.GetDatesClass(1);
var anotherDatesClass = DatesProvider.GetDatesClass(2);
if (datesClass.Dates.Contains(date)) {
Debug.Show(new DateAlreadyExistException()); // custom function for showing exception messages
return;
}
try {
datesClass.AddMonth(date);
} catch (ManyDatesException ex) {
Debug.Show(ex);
return;
}
// save everything to the actual database
}
列表并据此在其中设置了私有Date
,_dates
仍然为空且未分配。_dates
中分配_dates
时,它不会继续进行方法AddDate(DateTime date)
的其余部分,而是在{{1} }已经分配。这真令人沮丧,我将不胜感激。
答案 0 :(得分:0)
我认为问题的部分原因在于您试图协调3个私有字段和一个私有列表,并且有时列表或一个字段被更新而另一个不被更新。
根据您的评论和共享的代码,似乎并不需要真正的List<DateTime> _dates
。听起来您只需要具有3个私有属性(我想是为了进行数据绑定?),您想将它们显示为列表,并想提供一种添加日期的方法。
如果这都是真的,那么您应该可以封装字段,而无需在幕后添加实际的私有列表:
public class DatesClass
{
[Column(CanBeNull = false)]
private string FirstDate { get; set; } = string.Empty;
[Column(CanBeNull = false)]
private string SecondDate { get; set; } = string.Empty;
[Column(CanBeNull = false)]
private string ThirdDate { get; set; } = string.Empty;
public List<DateTime> Dates
{
get
{
var dates = new List<DateTime>();
DateTime temp;
if (DateTime.TryParse(FirstDate, out temp)) dates.Add(temp);
if (DateTime.TryParse(SecondDate, out temp)) dates.Add(temp);
if (DateTime.TryParse(ThirdDate, out temp)) dates.Add(temp);
return dates;
}
}
public void AddDate(DateTime date)
{
if (Dates.Contains(date)) return;
if (string.IsNullOrEmpty(FirstDate)) FirstDate = date.ToShortDateString();
else if(string.IsNullOrEmpty(SecondDate)) SecondDate = date.ToShortDateString();
else if(string.IsNullOrEmpty(ThirdDate)) ThirdDate = date.ToShortDateString();
else throw new ManyDatesException();
}
}