wpf数据绑定定时问题

wpf数据绑定定时问题,wpf,validation,data-binding,Wpf,Validation,Data Binding,我的装订有点问题。但是我找不到它 我有一个状态类型控件(UserControl),它有一个带有绑定的ItemsControl,该绑定依赖于提供断开规则列表的ViewModelBase对象,如下所示: <ItemsControl ItemsSource="{Binding BrokenRules}" > <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock

我的装订有点问题。但是我找不到它

我有一个状态类型控件(UserControl),它有一个带有绑定的ItemsControl,该绑定依赖于提供断开规则列表的ViewModelBase对象,如下所示:

<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();