我有一个数据绑定(bind)的ComboBox
,如下所示:
<ComboBox Canvas.Left="5" Canvas.Top="5" IsEnabled="{Binding Path=ComboBoxEnabled}" ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Mode=TwoWay, Path=SelectedItem}" Width="250">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock MaxWidth="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}}" Text="{Binding}" TextTrimming="CharacterEllipsis"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Label Canvas.Left="5" Canvas.Top="4" TextOptions.TextFormattingMode="Display" Content="No process instances have been found." Height="{DynamicResource {x:Static SystemParameters.WindowCaptionHeightKey}}" IsEnabled="False" Visibility="{Binding Path=WatermarkVisibility}" Width="250"/>
<Button Canvas.Right="5" Canvas.Top="5" Click="ClickRefresh" Content="Refresh" Width="75"/>
然后,在我的 MainWindow.xaml.cs 中:
public MainWindow()
{
InitializeComponent();
DataContext = m_ViewModel = new ViewModel();
}
private void ClickRefresh(Object sender, RoutedEventArgs e)
{
m_ViewModel.Populate();
}
这是我的 ViewModel.cs:
public ProcessInstance SelectedItem
{
get { return m_SelectedItem; }
set
{
if (m_SelectedItem != value)
{
m_SelectedItem = value;
NotifyPropertyChanged("SelectedItem");
}
}
}
public ObservableCollection<ProcessInstance> Items
{
get { return m_Items; }
private set
{
if (m_Items != value)
{
m_Items = value;
NotifyPropertyChanged("Items");
}
}
}
public ViewModel()
{
Populate();
}
public void Populate()
{
ProcessInstance selectedItem = m_SelectedItem;
SelectedItem = null;
Items = null;
List<ProcessInstance> processInstances = new List<ProcessInstance>();
foreach (Process process in Process.GetProcesses())
{
if (...)
processInstances.Add(new ProcessInstance(process));
}
if (processInstances.Count == 0)
{
ComboBoxEnabled = false;
WatermarkVisibility = Visibility.Visible;
}
else
{
Items = new ObservableCollection<ProcessInstance>(processInstances.OrderBy(x => x.Process.Id));
if (selectedItem != null)
SelectedItem = m_Items.SingleOrDefault(x => x.ProcessEquals(selectedItem));
if (m_SelectedItem == null)
SelectedItem = m_Items[0];
ComboBoxEnabled = true;
WatermarkVisibility = Visibility.Hidden;
}
}
这是我的 ProcessInstance 类相关代码:
public override Boolean Equals(Object obj)
{
return Equals(obj as ProcessInstance);
}
public override Int32 GetHashCode()
{
Int32 hashCode;
if ((m_Process == null) || m_Process.HasExited)
hashCode = 0;
else
{
hashCode = (m_Process.Id.GetHashCode() * 397) ^ m_Process.MainModule.BaseAddress.GetHashCode();
if (!String.IsNullOrEmpty(m_Process.MainWindowTitle))
hashCode = (hashCode * 397) ^ m_Process.MainWindowTitle.GetHashCode();
}
return hashCode;
}
public override String ToString()
{
String processId = process.Id.ToString("X8", CultureInfo.CurrentCulture);
String windowTitle = (process.MainWindowTitle.Length > 0) ? process.MainWindowTitle : "NULL";
return String.Format(CultureInfo.CurrentCulture, "[{0}] {1} - {2}", type, processId, windowTitle);
}
public Boolean Equals(ProcessInstance other)
{
if (other == null)
return false;
if (ReferenceEquals(this, other))
return true;
if (m_Process == null)
{
if (other.Process == null)
return true;
return false;
}
if (other.Process == null)
return false;
return ((m_Process.Id == other.Process.Id) && (m_Process.MainModule.BaseAddress == other.Process.MainModule.BaseAddress) && (m_Process.MainWindowTitle == other.Process.MainWindowTitle));
}
public Boolean ProcessEquals(ProcessInstance other)
{
if (other == null)
throw new ArgumentNullException("other");
if (m_Process == null)
return (other.Process == null);
if (other.Process == null)
return false;
return ((m_Process.Id == other.Process.Id) && (m_Process.MainModule.BaseAddress == other.Process.MainModule.BaseAddress));
}
现在发生了什么......我在没有流程实例存在的情况下启动了应用程序:
然后我打开一个或多个流程实例并单击“刷新”按钮。 ComboBox 默认选择第一个...我可以保留那个选择或选择另一个,没关系:
现在我关闭每个流程实例并再次单击“刷新”按钮。在这种情况下,Populate() 方法将 SelectedItem 和 Items 都设置为 null,因此 ComboBox 看起来是空的,然后它禁用 ComboBox 并使水印 Label 可见。但这是我得到的:
之前的SelectedItem还在。为什么?为什么?!?!
[编辑] 这是一个下载项目的链接:
最佳答案
您需要清除 ComboBox
上的 SelectedValue
属性,或者将 SelectedIndex
设置为 -1
关于c# - 疯狂使用 ComboBox SelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16235558/