首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遇到WPF ComboBox SelectionChanged事件触发器的奇怪行为:要么在创建UserControl时触发,要么根本不触发

遇到WPF ComboBox SelectionChanged事件触发器的奇怪行为:要么在创建UserControl时触发,要么根本不触发
EN

Stack Overflow用户
提问于 2020-08-27 08:29:50
回答 1查看 303关注 0票数 0

我目前正在开发一个C# WPF应用程序,遇到了一个非常奇怪的错误。我从使用多个窗口转向使用UserControls,并经历了一种非常奇怪的行为。我得到了一个名为UserControl的DataEntryControl,它有一个带有SelectionChanged触发器的ComboBox,XAML如下所示:

代码语言:javascript
运行
复制
<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#-代码如下(摘录):

代码语言:javascript
运行
复制
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版:

代码语言:javascript
运行
复制
public void dataEntryClick(object sender, RoutedEventArgs e)
{
    ControlGrid.Children.Clear();
    ControlGrid.Children.Add(new DataEntryControl());
}

这将导致在创建控件时立即调用cbEntry_SelectionChanged方法,并为tbSavedtbTotal抛出一个NullPointerException (两个TextBoxes)。我不知道这怎么会发生?如果还没有加载属于XAML的属性,如何触发事件触发器?

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

我尝试过的另一件事是在加载DataEntryControl实例之前(在创建MainWindow实例时)创建它,使MainWindow中的C#-代码看起来如下所示:

第2版:

代码语言:javascript
运行
复制
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时,我也没有遇到这个问题,这使得它更加奇怪。我希望有人能帮我,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-08-27 08:34:59

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

代码语言:javascript
运行
复制
<ComboBoxItem Content="Auto - Benziner" IsSelected="True" />

这将导致ComboBox在其创建后立即选择第一项,导致选择从“空”更改为第一项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63612108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档