gpt4 book ai didi

c# - 当以编程方式更改属性时,PropertyChange 为 null

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:59 24 4
gpt4 key购买 nike

我在 DataGrid 中有一个复选框列,在 DataGrid 列中有一个主要复选框。当我选中主复选框时,DataGrid 中所有选中的复选框都将被选中。

当我选中主复选框时,我会像那样检查所有 bool 属性 =>

foreach (TSModel value in TimeSheetList.Intersect(selectedlist))
{

if (!chkmain.IsChecked.GetValueOrDefault())
{
value.IsApproved = false;
}
else
{
value.IsApproved = true;
}
}

我的 TSModel =>

public class TSModel:BaseModel, ICloneable
{

bool _IsApproved;
public bool IsApproved
{
get
{
return _IsApproved;
}
set
{

if (_IsApproved != value)
{
_IsApproved = value;
RaisePropertyChange("IsApproved");
}
}
}

}

我的基础模型 =>

public class BaseModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChange(string prop)
{
try
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
IsUpdated = true;
}
}
catch (Exception ex)
{
throw ex;
}
}
bool _IsUpdated = false;
public virtual bool IsUpdated
{
get
{
return _IsUpdated;
}
set
{
_IsUpdated = value;
}
}
}

我的问题是,如果我检查个人,这个 propertychanged 不为 null 并且 IsUpdated 属性为真,但是如果我检查 Main 复选框并检查代码更改,这个 propertychanged 为 null 并且 IsUpdated 为 false。

为什么我通过代码检查时我的propertychanged为null?

更新

  • 我看到另一个不知道为什么,我有 100 行,我只能看到 15 条记录,其余的通过垂直滚动显示。因此,当我选中更改所有复选框时,但如果我只看到 1 到 15,则只有 1 到 15 的 propertychanged 值具有值,其余为 null。如果我设想为 85 到 100,则只有 85 到 100 和 1 到 15 propertychanged 值具有值其余为空。

最佳答案

这是预料之中的,因为您当前看不到的项目(即 16 到 100 之间的行)是虚拟化的。没有必要为它们引发 PropertyChanged 事件,因为它们在屏幕上是不可见的。

虽然您仍然应该设置这些对象的属性值,但您不必担心未引发 PropertyChanged 事件。基类的 RaisePropertyChange 方法除了引发事件外不应执行任何其他操作:

public class BaseModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChange(string prop)
{
try
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
catch (Exception ex)
{
throw ex;
}
}

bool _IsUpdated = false;
public virtual bool IsUpdated
{
get
{
return _IsUpdated;
}
set
{
_IsUpdated = value;
RaisePropertyChange("IsUpdated");
}
}
}

您应该在 IsApproved 的 setter 中设置 IsUpdated 属性:

public bool IsApproved
{
get
{
return _IsApproved;
}
set
{

if (_IsApproved != value)
{
_IsApproved = value;
RaisePropertyChange("IsApproved");
IsUpdated = true;
}
}

另一种选择是在 null 检查之前设置属性:

public void RaisePropertyChange(string prop)
{
try
{
IsUpdated = true;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
catch (Exception ex)
{
throw ex;
}
}

如果您正确绑定(bind)了 CheckBox,一旦它变得可见,即当您将其滚动到 View 中时,它就会根据源属性被选中或取消选中。

您可以在 docs 中阅读有关 UI 虚拟化概念的更多信息.

关于c# - 当以编程方式更改属性时,PropertyChange 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55946312/

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