遇到 WPF 组合框选择的奇怪行为更改的事件触发器:在创建用户控件时触发或根本不触发



我目前正在开发一个C#WPF应用程序,遇到了一个非常奇怪的错误。我从使用几个窗口转到使用UserControls,并经历了一个非常奇怪的行为。我得到了一个名为DataEntryControl的UserControl,它有一个带有SelectionChanged触发器的ComboBox,XAML看起来像这样:

<StackPanel Grid.Row="1" Grid.Column="3" VerticalAlignment="Center">
<ComboBox Name="cbEntry" Width="200" HorizontalAlignment="Left" SelectionChanged="cbEntry_SelectionChanged">
<ComboBoxItem Content="Auto - Benziner" IsSelected="True" />
<ComboBoxItem Content="Auto - Diesel" />
<ComboBoxItem Content="Auto - Hybrid" />
<ComboBoxItem Content="Auto - Elektro" />
<ComboBoxItem Content="ÖPNV" />
<ComboBoxItem Content="Fahrrad" />
<ComboBoxItem Content="E-Bike" />
<ComboBoxItem Content="Homeoffice" />
</ComboBox>
</StackPanel>

DataEntryControl的C#代码如下(摘录(:

public partial class DataEntryControl : UserControl
{
Benutzer currentUser = MainWindow.currentUser;
DBContext db = new DBContext();
public DataEntryControl()
{
InitializeComponent();
}
private void cbEntry_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (currentUser == null) return;
double saved = (db.Anreisetypen.Find(currentUser.AnreisetypenID).co2ProKm * currentUser.distanz -
db.Anreisetypen.Find(MainWindow.fahrzeugID((cbEntry.SelectedItem as ComboBoxItem).Content.ToString())).co2ProKm * currentUser.distanz);
tbSaved.Text = "Dadurch gespart:n" + saved.ToString() + "g CO2";
tbTotal.Text = "Einsparung gesamt:n" + (currentUser.ersparnis + saved).ToString() + "g CO2";
}
}

控件是在用户单击主窗口中的按钮时创建的,但在这里,我遇到了两种非常奇怪的行为,这取决于我如何激活UserControl。

版本1:

public void dataEntryClick(object sender, RoutedEventArgs e)
{
ControlGrid.Children.Clear();
ControlGrid.Children.Add(new DataEntryControl());
}

这导致在创建控件时立即调用cbEntry_SelectionChanged方法,从而为tbSavedtbTotal(两个TextBox(抛出NullPointerException。我想知道这怎么会发生?如果尚未加载所属的XAML,如何触发事件触发器??

在这之后,我想我可以检查这些对象是否为null,这消除了错误,但没有为这两个文本框设置Text,这很烦人。我可以通过在忽略事件的第一次触发后模拟点击来解决这个问题,我只是好奇。

我尝试的另一件事是在加载DataEntryControl实例之前创建它(在创建MainWindow实例时(,使我在MainWindow中的C#代码看起来像这样:

版本2:

public partial class MainWindow: Window {
DataEntryControl d { get; set; } = new DataEntryControl();
//... constructor and stuff
public void dataEntryClick(object sender, RoutedEventArgs e)
{
ControlGrid.Children.Clear();
ControlGrid.Children.Add(d);
}
}

然而,这会导致cbEntry_SelectionChanged从不被触发。它在初始化时不会被触发(这很好(,但在更改选择时也不会被触发,这很奇怪,因为它会侦听SelectionChanged事件。

正如我之前所写的:我为这个问题建立了一个不太好的解决方案,如果ComboBox或TextBoxes为空,我只中止了选择函数——这让我有99%的功能想要实现,但imo没有多大意义,因此我仍然想知道为什么WPF在这种情况下会这样。当我使用DataEntryWindow而不是DataEntryControl时,我也没有遇到这个问题,这让它变得更加奇怪。我希望有人能帮我,谢谢!

您描述的第一个问题是因为您的XAML中有:

<ComboBoxItem Content="Auto - Benziner" IsSelected="True" />

这将导致组合框在创建后立即选择第一个项目,导致选择从"Null"更改为第一个项目。

最新更新