gpt4 book ai didi

WPF数据绑定(bind)计时问题

转载 作者:行者123 更新时间:2023-12-02 05:02:27 29 4
gpt4 key购买 nike

我的绑定(bind)有问题。但我找不到它

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

<ItemsControl ItemsSource="{Binding BrokenRules}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink Foreground="Red" >
<TextBlock Text="{Binding Description}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

绑定(bind)按照我想要的方式工作,即显示所有损坏的规则描述。规则几乎只是一个描述和一个在规则被告知验证自身时执行的委托(delegate)。

大多数规则都具有在规则被要求验证自身之前预先已知的描述。例如,“Name is not valued”很好地描述了验证委托(delegate) !Name.IsNullOrEmptyAfterTrim() 失败时出现的问题。

问题源于一个特定的规则,该规则检查重复的名称。如果重复检查失败,我希望能够说出重复的值是什么,这是不可能预先知道的。因此,规则需要在执行验证委托(delegate)时更新描述。

当我在验证委托(delegate)中进行单元测试或留下调试跟踪时,损坏的规则描述将被更新。但是当我运行该应用程序时,损坏的规则描述是更新之前的内容。

因此我猜测我的绑定(bind)不正确。谁能建议问题/修复是什么?

干杯,
贝里尔

更新====================

这是我的 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;
}

最佳答案

您必须确保 BrokenRules 可观察集合实例不会更改, View 模型上的代码应如下所示:

public ObservableCollection<BrokenRule> BrokenRules
{
get;
set;
}

private void ValidateRules()
{
// Validation code
if (!rule.IsValid)
{
this.BrokenRules.Add(new BrokenRule { Description = "Duplicated name found" });
}
}

例如,如果您执行以下操作:

this.BrokenRules = this.ValidateRules();

您将更改绑定(bind)到 ItemsControl 的集合而不通知它,并且更改不会反射(reflect)在 UI 上。

关于WPF数据绑定(bind)计时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261271/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com