C# WPF组合框所选项目正在消失
我在使用WPF组合框时遇到了一些问题。我的应用程序使用组合框列出要连接的可用IP地址,并在启动时自动填充最后选择的IP地址。因此,当应用程序启动并加载文件时,框显示如下: 单击“连接”按钮时,我的程序将启动另一个程序,然后由我的应用程序最小化。当焦点返回到我的应用程序时,组合框现在为空,如下所示: 起初我的想法是绑定错误(控制台中没有报告任何内容),但事实似乎并非如此。选定项绑定到的属性和选定项本身(在WPF元素上)都有效。我在setter上为属性设置了一个断点,没有异常情况发生。我还有一个单独的线程,直接从WPF元素每隔0.5秒打印一次所选项目。即使IP地址不再可见,所选项目仍然是“192.168.3.106” 有没有人对可能出现的问题有什么想法。相关代码如下。如果需要更多的信息,请告诉我 XAML:C# WPF组合框所选项目正在消失,c#,wpf,xaml,combobox,C#,Wpf,Xaml,Combobox,我在使用WPF组合框时遇到了一些问题。我的应用程序使用组合框列出要连接的可用IP地址,并在启动时自动填充最后选择的IP地址。因此,当应用程序启动并加载文件时,框显示如下: 单击“连接”按钮时,我的程序将启动另一个程序,然后由我的应用程序最小化。当焦点返回到我的应用程序时,组合框现在为空,如下所示: 起初我的想法是绑定错误(控制台中没有报告任何内容),但事实似乎并非如此。选定项绑定到的属性和选定项本身(在WPF元素上)都有效。我在setter上为属性设置了一个断点,没有异常情况发生。我还有一个
更有可能的是,您没有覆盖投影仪中的
Equals()
,因此,将使用参照比较,如果选择了投影仪实例,则在投影仪设置中找不到该实例。投影仪列表中,您将有组合框显示空白值。@Sinatr我不会直接比较投影仪对象,因此,除非有我不知道的内部比较,我不认为这是问题所在。当然有比较:ComboBox
不会更改其当前的SelectedItem
,如果您只更改ItemsSource
。它将尝试保留它(通过在新的项目集合中执行查找),但由于比较失败,它将显示空白值。我并不是说这会解决您的问题(如果您希望解决问题,请提供),但缺少Equals()
可能是空CombBox
@Sinatr的最常见原因之一,尽管如此,我不会更改ItemsSource
。我正在更改SelectedProjector
。然而,我确实尝试了实现Equals方法,但没有结果。我将开始处理mcve并在完成后进行更新。更有可能的是,您没有覆盖投影仪中的Equals()
,因此,将使用参照比较,如果选择了投影仪实例,则在投影仪设置中找不到该实例。投影仪列表中,您将有组合框显示空白值。@Sinatr我不会直接比较投影仪对象,因此,除非有我不知道的内部比较,我不认为这是问题所在。当然有比较:ComboBox
不会更改其当前的SelectedItem
,如果您只更改ItemsSource
。它将尝试保留它(通过在新的项目集合中执行查找),但由于比较失败,它将显示空白值。我并不是说这会解决您的问题(如果您希望解决问题,请提供),但缺少Equals()
可能是空CombBox
@Sinatr的最常见原因之一,尽管如此,我不会更改ItemsSource
。我正在更改SelectedProjector
。然而,我确实尝试了实现Equals方法,但没有结果。我将开始工作的mcve和更新时完成。
<StackPanel Name="Stack">
<Label Content="Active Projector"/>
<ComboBox
Name="ProjectorComboBox"
BorderBrush="DarkGray"
Background="Transparent"
Width="140"
ToolTip="Select the projector to use."
Loaded="ComboBox_Loaded"
ItemsSource="{Binding ProjectorSettings.Projectors}"
SelectedItem="{Binding SelectedProjector}">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="ToolTip" Value="{Binding IP}"/>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</StackPanel>
public Projector SelectedProjector
{
get
{
return _selectedProjector;
}
set
{
if (value == null)
{
System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow;
return;
}
_selectedProjector = value;
FirePropertyChanged("SelectedProjector");
_autoSelectedProjector = false;
RefreshProjector();
}
}
public void LaserComboboxLoaded()
{
var currentProjector = Registry.GetValue("HKEY_CURRENT_USER\\SOFTWARE\\LAP\\LaserProjector\\Settings", "GatewayIP", string.Empty);
if (currentProjector != null)
{
foreach (Projector proj in _projectorSettings.Projectors)
{
if (proj.IP == currentProjector as string)
{
_selectedProjector = proj;
FirePropertyChanged("SelectedProjector");
if (!LaserTool.IsProjecting)
{
_autoSelectedProjector = true;
}
}
}
}
}