我有一个像这样的模型:
public class MyViewModel
{
public TimeSpan AverageLogOn { get; set; }
public TimeSpan AverageLogOff { get; set; }
public TimeSpan AverageTotalHours { get; set; }
}
我使用此模型作为列表,如:
public IList<MyViewModel> MyViewModelList { get; set; } = new List<MyViewModel>();
我想做的是将其格式化AverageLogOn
为“ hh:mm:ss”,我该如何使用LINQ,我认为是这样的:
MyViewModel.Select(x => new MyViewModel { AverageLogOn = x.AverageLogOn.ToString("hh:mm:ss"), AverageLogOff = x.AverageLogOff, AverageTotalHours = x.AverageTotalHours });
但是当我尝试x.AverageLogOn.ToString("hh:mm:ss")
它抛出一个错误
无法将类型'string'隐式转换为'System.TimeSpan'
我究竟做错了什么?问候
我究竟做错了什么?
您正在尝试将a分配给string
需要TimeSpan
值的属性。就像错误消息说的那样。基本上,与此问题相同:如何将时间从DateTime.Now转换为24Hr格式。
您没有提供太多上下文,因此不清楚如何使用Select()
通话结果。这是可能的,它是在一个上下文string
值实际上是有道理的,这些属性。如果是这样,那么您可以MyViewModel
从代码中删除并创建一个匿名类型:
MyViewModelList.Select(x => new { AverageLogOn = x.AverageLogOn.ToString("hh:mm:ss"), AverageLogOff = x.AverageLogOff, AverageTotalHours = x.AverageTotalHours });
您将获得对象的枚举,其类型是未命名的(即“匿名”),并且与原始MyViewModel
对象类型不同,该对象AverageLogOn
现在的属性为typestring
而不是TimeSpan
。但是请注意,匿名类型的使用方式受到限制。但是,由于WPF在XAML中执行所有操作时都没有太多的类型安全性,因此完全有可能完全满足您的要求。
注意:您不会在帖子中显示如何实际使用对的调用结果Select()
。但我想确保您了解这Select()
对原始集合没有任何作用。它不会修改MyViewModelList
。该Select()
方法返回IEnumerable<MyViewModel>
here的一个实例,并且您必须以某种方式使用该引用来实际查看所做的工作Select()
。(实际上,除非您实际上“实现”了该枚举,即以某种方式枚举值的序列,否则实际上什么都不会发生,甚至没有匿名类型对象的实例化。)
另一方面,也许您真正需要的只是调整XAML以按TimeSpan
所需方式格式化值。在这种情况下,您根本不需要该Select()
方法。相反,您需要StringFormat
在绑定标记中包含说明符,如下所示:
<TextBox Text="{Binding AverageLogOn, StringFormat={}{0:hh}:{0:mm}}" />
有关更多信息,请参阅此问题:如何在wpf中格式化转换器参数。
错误本身的原因很明显,并且错误消息似乎足够清楚。首先,您缺乏有关为何会陷入困境的更多细节,因此很难确定要真正回答问题的方式。我认为以上内容应能充分解决您的问题,但是如果这些建议不能解决您的问题,请编辑您的问题以进行改进,以便清楚地知道您要做什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句