gpt4 book ai didi

c# - 在哪里提出 NotifyPropertyChanged?

转载 作者:行者123 更新时间:2023-12-03 11:00:14 26 4
gpt4 key购买 nike

我刚刚根据 Rachel Lim 的 blog 实现了我的业务逻辑验证。 .
一切都运行良好,直到我决定在绑定(bind)到 的 View 中放置一个触发器。有效像这样的属性(property):

<ListBox ItemsSource="{Binding EdgedBoards}" SelectedItem="{Binding SelEdgedBoard, Mode=TwoWay}" DisplayMemberPath="Name"> 
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="Focusable" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsValid}" Value="False">
<Setter Property="Focusable" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>

问题是当绑定(bind)的项目有错误(SelEdgedBoard.IsValid == false)时,触发器不会被通知重新评估,并且项目将其可聚焦属性保持为真。

我已经尝试在 GetValidationError() 返回其值之前放置 NotifyPropertyChanged("IsValid") ,但是这样我得到了一个 stackoverflow 异常:
#region IsValid Property

public bool IsValid
{
get
{
return string.IsNullOrWhiteSpace(GetValidationError());
}
}

public string GetValidationError()
{
string error = null;

if (ValidatedProperties != null)
{
foreach (string s in ValidatedProperties)
{
error = GetValidationError(s);
if (!string.IsNullOrWhiteSpace(error))
{
break;
}
}
}

NotifyPropertyChanged("IsValid");
return error;
}

#endregion

最佳答案

当然,它会导致堆栈溢出。当你这样做时:

NotifyPropertyChanged("IsValid")

您强制 WPF 基础结构重新评估 IsValid 的值。它通过调用 IsValid getter 来做到这一点,而后者又再次调用 GetValidationError!

有几种方法可以处理这个问题。我可能会创建一个私有(private)成员变量来保存 IsValid 的最后一个值,然后在调用 NotifyPropertyChanged 之前将当前值与旧值进行比较。

另一种方法可能是仅在您的已验证属性之一发生更改时(因此在每个属性的 setter 中)调用 NotifyPropertyChanged("IsValid"),因为这可能会导致 IsValid 发生更改。

关于c# - 在哪里提出 NotifyPropertyChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11651446/

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