我的绑定出现了问题,但我找不到原因。
我有一个状态类型控件(UserControl),其中包含一个ItemsControl,其绑定依赖于ViewModelBase对象,该对象提供了BrokenRules列表,如下所示:
<ItemsControl ItemsSource="{Binding BrokenRules}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink Foreground="Red" >
<TextBlock Text="{Binding Description}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
绑定方式符合我的要求,因为所有违反规则的说明都会显示出来。规则基本上就是一个描述和一个在规则被告知验证自身时执行的委托。
大多数规则在被要求验证自身之前就已经知道了其描述。例如,“名称未赋值”是如果验证委托!Name.IsNullOrEmptyAfterTrim()失败,出现问题的良好描述。
问题出现在特定的规则中,该规则检查重复名称。如果重复检查失败,我想能够说出重复的值,这是事先不可能知道的。因此,当执行验证委托时,规则需要更新描述。
当我进行单元测试或在验证委托中留下调试跟踪时,损坏的规则说明会更新。但是当我运行应用程序时,损坏的规则说明仍然是之前的样子。
因此,我猜测我的绑定不正确。有人能建议问题/解决方案吗?
问候,Berryl
更新====================
这是我的ViewModelBase类中的代码:
private readonly List<RuleBase> _rules = new List<RuleBase>();
// inheritors add rules as part of construction
protected void _AddRule(RuleBase rule) { _rules.Add(rule); }
public ObservableCollection<RuleBase> BrokenRules { get { return _brokenRules; } }
protected ObservableCollection<RuleBase> _brokenRules;
public virtual IEnumerable<RuleBase> GetBrokenRules() {
return GetBrokenRules(string.Empty);
}
public virtual IEnumerable<RuleBase> GetBrokenRules(string property) {
property = property.CleanString();
_brokenRules = new ObservableCollection<RuleBase>();
foreach (var r in _rules) {
// Ensure we only validate this rule
if (r.PropertyName != property && property != string.Empty) continue;
var isRuleBroken = !r.ValidateRule(this);
if (isRuleBroken) _brokenRules.Add(r);
return _brokenRules;
}