wpf数据绑定定时问题
我的装订有点问题。但是我找不到它 我有一个状态类型控件(UserControl),它有一个带有绑定的ItemsControl,该绑定依赖于提供断开规则列表的ViewModelBase对象,如下所示:wpf数据绑定定时问题,wpf,validation,data-binding,Wpf,Validation,Data Binding,我的装订有点问题。但是我找不到它 我有一个状态类型控件(UserControl),它有一个带有绑定的ItemsControl,该绑定依赖于提供断开规则列表的ViewModelBase对象,如下所示: <ItemsControl ItemsSource="{Binding BrokenRules}" > <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock
<ItemsControl ItemsSource="{Binding BrokenRules}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink Foreground="Red" >
<TextBlock Text="{Binding Description}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
绑定按照我想要的方式工作,即显示任何和所有违反规则的描述。规则基本上只是一个描述和一个委托,当规则被告知进行自我验证时执行
大多数规则的描述都是在要求规则验证自身之前预先知道的。例如,“Name is not valued”(名称未赋值)是一个很好的描述,它描述了验证委托出错的原因!Name.IsNullOrEmptyAfterTrim()失败
问题来自一个特殊的规则,它检查重复的名称。如果dup检查失败,我希望能够说出复制值是什么,这是不可能预先知道的。因此,在执行验证委托时,规则需要更新描述
当我在验证委托中进行单元测试或留下调试跟踪时,将更新中断的规则描述。但当我运行应用程序时,被破坏的规则描述就是更新之前的情况
因此,我猜我的装订不正确。有人能提出问题/解决方案吗
干杯,贝里尔 更新==================== 这是我的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;
}
private readonly List_rules=new List();
//继承者添加规则作为构造的一部分
受保护的void _AddRule(规则库规则){_rules.Add(规则);}
公共ObserviceCollection BrokenRules{get{return}
受保护的可观察到的收集规则;
公共虚拟IEnumerable GetBrokerRules(){
返回GetBrokenRules(string.Empty);
}
公共虚拟IEnumerable GetBrokerRules(字符串属性){
property=property.CleanString();
_brokenRules=新的可观察集合();
foreach(var r在_规则中){
//确保我们只验证此规则
如果(r.PropertyName!=property&&property!=string.Empty)继续;
var isrulebreaked=!r.ValidateRule(this);
如果(isrulebreaked)\ u breakenrules.添加(r);
返回-中断规则;
}
您必须确保BrokenRules observable集合实例不会更改,您在视图模型上的代码应该如下所示:
public ObservableCollection<BrokenRule> BrokenRules
{
get;
set;
}
private void ValidateRules()
{
// Validation code
if (!rule.IsValid)
{
this.BrokenRules.Add(new BrokenRule { Description = "Duplicated name found" });
}
}
您将在不通知的情况下更改绑定到ItemsControl的集合,并且更改不会反映在UI上。您的ViewModel基类是否实现INotifyPropertyChanged?即,UI是否知道Description属性何时更改?您是否将项添加到BrokenRules集合?它是一个可观察的集合?@Matt.Y是的,VmBase实现了INPC。至于你答案的第二部分,我认为Aero很接近于这一点,如果我不每次重新创建集合实例,那么UI将与更改保持同步。需要通过tho进行操作。Cheers规则库是否也实现了INPC?如果它的描述属性中的更改应该告知UI,则需要实现INPC。@Jens.RuleBase没有实现INPC,但现在它实现了。我将PC事件注册到一个空委托,以便它触发,它正在执行此操作,但UI在更改之前仍显示描述。我想你已经接近它了。我列出的破坏规则不是ObservableCollection,它会在每个循环中创建一个新实例。我修复了集合类型,因为这很简单,接下来我将研究如何在同一个集合实例中实现这一点。您需要删除未中断的规则,并添加已中断的规则,这样就不那么简单了。Cheers@Berryl:您可以使用
.Clear()而不是创建新集合
。这不会破坏数据绑定。此处所有注释的组合使其正常工作。由于Anero有我唯一可以标记为答案的东西,因此我将其标记为正确答案。谢谢大家!
this.BrokenRules = this.ValidateRules();