【发布时间】:2023-03-09 20:44:01
【问题描述】:
我有两个类,节点和连接。节点有它的名称和编号作为属性,连接字面意思是关于两个节点之间的连接信息。我使用这两个类作为 OservableCollection 声明为静态的。 NodeNubmer 和 NodeName 属性的 CollectionPropertyChangedEventHandler 是在 Node 类中实现的,所以当任何一个节点的信息在 UI 中通过数据绑定发生变化时,UI 和后面的节点信息代码都会发生变化。但是,Connection 中的节点信息不会更改,例如在 UI 中更改节点名称时。这是代码的一部分。在Node中更改时如何更新Connection中的节点信息?
public Class Node: INotifyPropertyChanged
{
private int _nodeNumber;
private string _nodeName;
public int NodeNumber
{
get
{
return _nodeNumber;
}
set
{
_nodeNumber = value;
OnPropertyChanged("NodeNumber");
}
}
public string NodeName
{
get
{
return _nodeName;
}
set
{
_nodeName = value;
OnPropertyChanged("NodeName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
// constructor
public Node(int nodeNumber, string nodeName)
{
_nodeNumber = nodeNumber;
_nodeName = nodeName;
}
public void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public Class Connection: INotifyPropertyChanged
{
private int _sourceNumber;
private int _destNamber;
private string _sourceName;
private string _destName;
public int SourceNumber
{
get
{
return _sourceNumber;
}
set
{
_sourceNumber = value;
OnPropertyChanged("SourceNumber");
}
}
public int DestNumber
{
get
{
return _destNumber;
}
set
{
_destNumber = value;
OnPropertyChanged("DestNumber");
}
}
public string SourceName
{
get
{
return _sourceName;
}
set
{
_sourceName = value;
OnPropertyChanged("SourceName");
}
}
public string DestName
{
get
{
return _destName;
}
set
{
_destName = value;
OnPropertyChanged("DestName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
// constructor
public Connection(int sourceNumber, int destNumber)
{
_sourceNumber = sourceNumber;
_destNumber = destNumber;
// I guess this code is the reason why SourceName/DestName isn't changed when its node's name changed in UI, but I don't know how to fix this code.
// NodeInfo is ObservableCollection of Node
SourceName = NodeInfo.Collection[sourceNumber-1].NodeName;
DestName = NodeInfo.Collection[destNumber-1].NodeName;
}
public void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
【问题讨论】:
-
如果 Connection 有两个 Node 属性(例如 Source 和 Destination),并且您的绑定类似于
{Binding Path=Source.NodeName}而不是{Binding Path=SourceName},它可能会按照您的意愿工作。 -
我修正了拼写错误。 SourceName = NodeInfo.Collection[sourceNumber-1].NodeName; DestName = NodeInfo.Collection[destNumber-1].NodeName;很抱歉让您感到困惑,但我想这与 UI(xaml) 和代码隐藏 (c#) 之间的数据绑定无关。这是对象代码隐藏之间的问题,因为 ConnectionInfo.Collection 也不会改变,所以 UI 不会改变。感谢您的帮助。
标签: c# data-binding code-behind inotifypropertychanged local-variables