我目前正在开发一个C# WPF应用程序,遇到了一个非常奇怪的错误。我从使用多个窗口转向使用UserControls,并经历了一种非常奇怪的行为。我得到了一个名为UserControl的DataEntryControl
,它有一个带有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";
}
}
控件是在用户单击MainWindow中的按钮时创建的,但在这里,我遇到了两种非常奇怪的行为,这取决于我如何激活UserControl。
第1版:
public void dataEntryClick(object sender, RoutedEventArgs e)
{
ControlGrid.Children.Clear();
ControlGrid.Children.Add(new DataEntryControl());
}
这将导致在创建控件时立即调用cbEntry_SelectionChanged
方法,并为tbSaved
和tbTotal
抛出一个NullPointerException (两个TextBoxes)。我不知道这怎么会发生?如果还没有加载属于XAML的属性,如何触发事件触发器?
在这之后,我想我只需要检查这些对象是否为null,这就消除了错误,但是这两个文本框没有设置文本,这是很烦人的。在忽略事件的第一次触发之后,我可以通过模拟点击来解决这个问题,我只是好奇。
我尝试过的另一件事是在加载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
to ,从不触发。它不会在初始化时触发(这很好),但在更改选择时也不会触发,这很奇怪,因为它会监听SelectionChanged事件。
正如我之前所写的:我为这个问题建立了一个不太好的解决方案,如果ComboBox或TextBoxes都是空的,我就中止选择函数--这使我拥有了我想要实现的99%的功能,但是imo没有太多的意义,因此我仍然想知道为什么WPF在这种情况下会这样运行。当我使用DataEntryWindow
而不是DataEntryControl
时,我也没有遇到这个问题,这使得它更加奇怪。我希望有人能帮我,谢谢!
发布于 2020-08-27 08:34:59
您描述的第一个问题是因为您的XAML中有:
<ComboBoxItem Content="Auto - Benziner" IsSelected="True" />
这将导致ComboBox在其创建后立即选择第一项,导致选择从“空”更改为第一项。
https://stackoverflow.com/questions/63612108
复制相似问题