【发布时间】:2021-09-18 18:25:48
【问题描述】:
我有一个包含活动网络接口条目的组合框。我喜欢在用户每次打开下拉菜单时刷新条目。
遗憾的是,如果 ComboBox 打开然后关闭(右侧有箭头),则不再显示所选条目。 ComboBox 显示为空。 My ComboBox before and after
如果我删除 DropDownOpened 事件,则在打开关闭 DropDown 后,所选项目将显示在 ComboBox 中。
感谢您的帮助。
这是我的看法:
<ComboBox ItemsSource="{Binding HostInterfaces}"
SelectedItem="{Binding HostInterfaceSelected, Mode=TwoWay}"
DisplayMemberPath="Indicator">
<i:Interaction.Triggers>
<i:EventTrigger EventName="DropDownOpened">
<i:InvokeCommandAction Command="{Binding Path=DropDownOpenedCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
这是我的视图模型:
private RelayCommand _dropDownOpenedCommand;
public ICommand DropDownOpenedCommand => _dropDownOpenedCommand ??
(_dropDownOpenedCommand =
new RelayCommand(ExecuteDropDownOpenedCommand));
private void ExecuteDropDownOpenedCommand(object obj)
{
HostInterfaces.Clear();
// add several entries
_hostInterfaces.Add( ... );
}
private readonly ObservableCollection<HostNetworkInterfaceEntry> _hostInterfaces = new ObservableCollection<HostNetworkInterfaceEntry>();
public ObservableCollection<HostNetworkInterfaceEntry> HostInterfaces => _hostInterfaces;
private HostNetworkInterfaceEntry _hostInterfaceSelected;
public HostNetworkInterfaceEntry HostInterfaceSelected
{
get => _hostInterfaceSelected;
set
{
if (value == null) return;
if (value == _hostInterfaceSelected) return;
_hostInterfaceSelected = value;
OnPropertyChanged(nameof(HostInterfaceSelected));
}
}
我的 HostNetWorkInterfaceEntry 类:
public class HostNetworkInterfaceEntry
{
public HostNetworkInterfaceEntry(string name, IPAddress address)
{
Name = name;
Address = address;
}
public string Name { get; private set; }
public IPAddress Address { get; private set; }
public string Indicator => (Address != null ? $"{Address} {Name}" : $"{Name}");
}
【问题讨论】:
-
value == _hostInterfaceSelecteddo reference equals ...明显的解决方案是提供自己的实现(覆盖object.Equals和相关)...也有可能SelectedItem在没有项目时无效...所以您需要在清除本地之前存储并在添加元素后恢复它 -
您正在清除
HostInterfaces.Clear();,跟踪选择的值并在填充时再次选择正确的项目。