如何自动信号子属性更新时,基本属性在c#中改变?



有一个我真正想要解决的问题。我在网上没有找到足够好的答案,所以在那里问。接下来是形势。例如,我有任何ViewModel,其中一个属性描述返回任何对象,第二个属性描述这个对象属性之一,例如数组和第三个属性返回一个值,从第二个属性值计算。例如,布尔值,如果数组的长度>

0。问题在于,在这种情况下,如果第一个属性被更改,则自动更新第二个和第三个属性,并在第二个属性更改时更新第三个属性。现在,我最好的想法是创建一个描述属性之间关系的对象列表,然后在每个属性更新时遍历该列表并为每个子属性引发事件。

对象,描述属性关系

public class PropertyDependencies
{
public string PropertyName;
public string[] ChildProperties;
public PropertyDependencies(string propertyName, string[] childProperties)
{
PropertyName = propertyName;
ChildProperties = childProperties;
}
}

对象列表

List<PropertyDependencies> _dependencies = new List<PropertyDependencies>();

在构造函数

中设置这些关系
public TreeTaskViewModel()
{
_dependencies.Add(new PropertyDependencies(
nameof(SelectedItem),
new string[]
{
nameof(SelectedItemExists),
nameof(SelectedItemName),
nameof(SelectedItemDescription),
nameof(NewTaskCreation)
}));
_dependencies.Add(new PropertyDependencies(nameof(NewTaskCreation),
new string[]
{
nameof(TaskCreationButtonText)
}));
}

用法:

protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
PropertyDependencies? aim = null;
for (int i = 0; i < _dependencies.Count; i++)
{
if (_dependencies[i].PropertyName == propertyName)
{
aim = _dependencies[i];
break;
}
}
if (aim != null)
{
foreach (string childProperty in aim.ChildProperties)
{
OnPropertyChanged(childProperty);
}
}
}

谁曾经处理过这样的事情,有没有更简单、更优化的方法来解决它?提前谢谢你。

这可能不是完美的方式,但我会从父属性的setter触发子属性的Property Changed事件,如下所示:

private MyType _ParentProperty;
public MyType ParentProperty
{
set { 
_ParentProperty = value; 
notif(nameof(ParentProperty)); 
notif(nameof(SelectedItemExists));
notif(nameof(SelectedItemName));
//notify about other sub properties ..
}
get { return _ParentProperty; }
}
public bool SelectedItemExists //this gets notified every time the ParentProperty is assigned
{
get { return ParentProperty.Exists; }
}
public string SelectedItemName //also this
{
get { return ParentProperty.Name; }
}
// other sub properties

notif()函数驻留在我的BaseViewModel中,实现如下:

internal void notif(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

最新更新