gpt4 book ai didi

c# - 将 INotifyPropertyChanged 与包含复选框的 WPF TreeView 一起使用时防止无限循环

转载 作者:行者123 更新时间:2023-12-03 10:34:13 26 4
gpt4 key购买 nike

这是我的第一个问题,如果格式不正确,我深表歉意。

我是 WPF 和 MVVM 的新手,我遇到了一个我似乎无法弄清楚的问题。

我有一个 TreeView ,它显示一个 MenuItem 层次结构,每个 MenuItem 都有一个复选框,用于父节点和子节点。当前的解决方案允许用户单击父节点,并根据需要选中/取消选中所有子项。

我现在需要执行相反的操作,如果用户单击其中一个子节点,则应该选择父节点(如果尚未选择)。

我目前遇到的问题是,以编程方式检查父节点会触发父节点的 INotifiedPropertyChanged 事件,该事件会重新检查我的子节点。

如何防止这种情况发生?

这是我的 MenuItem 代码:​​

public class MenuItem : INotifyPropertyChanged
{
string _name;
List<MenuItem> _subItems = new List<MenuItem>();
bool _isChecked;
MenuItem _parent;

public List<MenuItem> SubItems
{
get { return _subItems; }
set
{
_subItems = value;
RaisePropertyChanged("SubItems");
}
}

public string Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged("Name");
}
}

public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
RaisePropertyChanged("IsChecked");
}
}

public MenuItem Parent
{
get { return _parent; }
set
{
_parent = value;
RaisePropertyChanged("Parent");
}
}

public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

if (propertyName == "IsChecked")
{
if (Parent == null)
{
foreach (MenuItem Child in _subItems)
Child.IsChecked = this.IsChecked;
}

//if (Parent != null)
//{
// Parent.IsChecked = IsChecked ? true :Parent.IsChecked;
//}
}
}
}

上面的注释代码是我遇到错误的地方。

任何指导将不胜感激。

最佳答案

只是根据 OP 已经写好的答案做了更详尽的回答

    public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;

if (_parent == null)
{
foreach (MenuItem Child in _subItems)
{
Child._isChecked = this._isChecked;
Child.RaisePropertyChanged("IsChecked");
}
}

if (_parent != null)
{
_parent.NotifyChecked(_isChecked);
}

RaisePropertyChanged("IsChecked");
}
}
public void NotifyChecked(bool childChecked)
{
_isChecked = childChecked;
RaisePropertyChanged("IsChecked");
if (_parent != null)
{
_parent.NotifyChecked(_isChecked);
}
}

关于c# - 将 INotifyPropertyChanged 与包含复选框的 WPF TreeView 一起使用时防止无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39485532/

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