我有一个带有“紧急度”字段的任务管理程序。有效值是Int16当前映射到1(高),2(中),3(低),4(无)和99(已关闭)。紧急字段用于对任务进行排名,以及更改列表和详细信息视图中项目的外观。
当用户正在编辑或添加新任务时,他们会选择或查看ComboBox中的紧急程度。转换器通过字符串来替换Ints。紧急集合非常简单,我没有把它作为数据库中的表,而是一个由方法填充的ObservableCollection(Int16)。
由于可以使用相同的屏幕查看已关闭的任务,因此“已关闭”的紧急程度必须位于ItemsSource中,但我不希望用户能够选择它。为了防止用户能够在ComboBox中选择该项目,但是如果数据库中的项目具有该值,我仍然能够看到它...
我问这是因为这是一个学习项目(我的第一个真正的WPF和第一个MVVM项目)。我知道很少有一种 Right 方式可以做某事但是我想确保我以合理的方式学习,因为它更难以忘掉坏习惯
由于
麦克
答案 0 :(得分:1)
我赞成选项2.听起来MVVM很时尚。
当有其他应用程序或您有报告访问“紧急度”字段时,选项3将是有利的。原因:否则您需要复制Int16及其含义之间的映射知识。将知识移动到数据库以将其保存在一个位置。
也许考虑使用Enums来使代码更具表现力:
enum Urgency { High=1, Medium=2, Low=3, Closed=99 };
通过这种方式,您将有一些非常好的方法来评估IsEnabled属性,如下所示:
if (urgency == Urgency.Closed) return false;
当您需要存储枚举的数值时,您需要事先对Int16进行强制转换。
答案 1 :(得分:1)
我认为我首先要在视图中修复此问题。让TextBlock
显示“已关闭”,并使用ComboBox
显示其他值,然后使用数据触发器在两者上设置IsVisible
,具体取决于紧急度是否为99。
我这样做不是因为它是最好的技术解决方案(可能不是),而是因为它(可能)是最好的UI解决方案。如果用户无法修改已关闭的项目,即使在已禁用的ComboBox
中显示“已关闭”也会有一点误导,因为ComboBox
在视觉上意味着“这是您可以更改的内容”。它被禁用只是提示用户想知道他要做什么来启用它。使用TextBlock
可以毫不含糊地说“这就是它的原因。”