WPF撤消重做属性系统,如果值已更改,则以红色突出显示

时间:2010-10-08 19:11:23

标签: wpf colors revert undo-redo

我对非常​​复杂的UI有以下要求。 (这里的复杂意味着表格中有很多控件[约100])。我正在使用 MVVM (如果我的问题需要它稍微远离MVVM我可以使用它)

我的问题是可编辑的ComboBox TextBox 。但我想说我喜欢听一个适合所有控件的常用算法

要求1 :用户编辑内容并转到下一个控件,控件/文本的颜色应变为红色。

要求2 :当用户返回先前编辑的控件并输入最初存在的值时,控件/文本的颜色应该变回黑色。

我知道要求很难,而且我一直在设计一个通用算法,我可以使用该算法存储前一个值并调用一个函数来改变控件的颜色。

只是给你一个想法,
- >我尝试为每个TextBox存储2个属性,如Default_Text和Text。但由于属性数量巨大,因此内存占用非常大。保持如此多的财产是非常艰难的 - >我尝试在每个ViewModel中添加一个Dictionary来存储已更改的值。但是我遇到的问题是为我的应用程序中的所有控件提供了唯一的键,这不是很有帮助 - >我甚至想过并尝试过像TextBox,ComboBox这样的子类控件,并覆盖一些方法以满足我的要求,但遗憾的是,当我开始添加验证时,我失败了。

所以在这里我坚持设计一个通用的WPF属性系统/算法来处理所有撤消重做功能,改变控件样式等等!

如果专家可以指导我正确的方向并帮助我开发这样的算法/系统,那将是非常好的。虽然样本插图会很好!!!

2 个答案:

答案 0 :(得分:0)

我找到了上述问题的答案。我为此使用了附加行为。有关此链接的更多详细信息,请参阅StackOverFlow中的Function call from XAML

当我进行数据绑定时,我使用Binding = OneWay将DataBound变量的初始值存储在Tag属性中。然后我为LostFocus事件编写了附加行为。

每当用户输入一个控件然后进入其他控件时,它就会触发LostFocus事件并调用我附加的行为。在此,我检查该值是否等于Tag中的值。如果它是相同的,我显示为黑色,否则我显示为红色。

WPF中的附加行为晃动。我可以干净利落地完成任何事情而不会让代码混乱!!!!

答案 1 :(得分:0)

另一种方法是在模型(或视图模型)中使用一些“脏”跟踪并绑定到属性isdirty(并将其转换为颜色)。