如何在C#/ WPF / MVVM App中处理ViewModel和Database

时间:2010-03-23 04:01:34

标签: sql wpf mvvm

我有一个带有“紧急度”字段的任务管理程序。有效值是Int16当前映射到1(高),2(中),3(低),4(无)和99(已关闭)。紧急字段用于对任务进行排名,以及更改列表和详细信息视图中项目的外观。

当用户正在编辑或添加新任务时,他们会选择或查看ComboBox中的紧急程度。转换器通过字符串来替换Ints。紧急集合非常简单,我没有把它作为数据库中的表,而是一个由方法填充的ObservableCollection(Int16)。

由于可以使用相同的屏幕查看已关闭的任务,因此“已关闭”的紧急程度必须位于ItemsSource中,但我不希望用户能够选择它。为了防止用户能够在ComboBox中选择该项目,但是如果数据库中的项目具有该值,我仍然能够看到它...

  1. 在代码或Xaml(我怀疑它)中手动禁用ComboBox中的项目
  2. 将Urgency集合从Int16更改为具有ComboBoxItem的isEnabled属性所绑定的可选属性的对象。
  3. 按照2进行操作,但也使用Tasks表中的外键将紧急信息分离到数据库中自己的表中
  4. 以上都不是(我怀疑这是正确答案)
  5. 我问这是因为这是一个学习项目(我的第一个真正的WPF和第一个MVVM项目)。我知道很少有一种 Right 方式可以做某事但是我想确保我以合理的方式学习,因为它更难以忘掉坏习惯

    由于

    麦克

2 个答案:

答案 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可以毫不含糊地说“这就是它的原因。”