我有一个简单的表单,可以扫描我的网络并查找计算机。我为找到的每台计算机动态添加用户控件。在每个用户控件中都有一个我需要管理的下拉列表。这是UI的屏幕截图:
每个列表框可能包含2个可能列表中的1个。为简单起见,假设左列列表框绑定到laptops.xml数据源,而右列列表框绑定到servers.xml。
让我们说laptops.xml包含以下条目:
和servers.xml包含以下条目:
所以我需要UI做的是每当用户从列表中选择一个项目时,该项目应该从其他列表中删除,这样它就不能被选中两次。请注意,它应该只修改与同一列表绑定的其他列表...换句话说,如果我选择“Mac Air'从第一个下拉列表开始,程序应该只修改另外两个列表而不是任何与server.xml绑定的列表框。
要确定哪个列表框绑定到哪个xml文件,我会在动态创建用户控件并将其添加到表单时使用列表框的.Tag
属性。
我认为我可以使用ObservableCollection来做到这一点但不确定如何实现它并让它做我需要的。
答案 0 :(得分:1)
您可以在表单级别保存所有选定计算机(或可能有2个列表,一个用于服务器,一个用于笔记本电脑)的列表。您的面板(包含组合框)应该订阅它的listchangeevent并在组合框发生变化时调整它们的项目。反之亦然,您需要订阅组合框的SelectedIndexChanged事件以维护该全局列表。
以您的形式:
ObservableCollection<string> selectedServers = new ObservableCollection<string>();
public void Load()
{
List<string> allServers = GetServerNames( "servers.xml" );
foreach( ComputerPanel pnl in serverPanels )
pnl.LoadLists( allServers, selectedServers );
}
在您的小组中:
public void LoadLists( List<string> allServers, ObservableCollection<string> selectedServers )
{
foreach( string server in allServers )
combo1.Items.Add( server );
selectedServers.CollectionChanged += selectedServers_CollectionChanged;
combo1.SelectedIndexChanged += ( object sender, EventArgs e ) => { selectedServers.Add( (string)combo1.SelectedItem ); };
}
private void selectedServers_CollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
{
string newlySelectedServer = (string)e.NewItems[0];
if( e.Action == NotifyCollectionChangedAction.Add
&& (string)combo1.SelectedItem != newlySelectedServer ) //only if selector was not my own combo
combo1.Items.Remove( newlySelectedServer );
}
(这段代码不是万无一失的,只是为了给你一个想法)