c# - 如何避免在 InitializeComponent 期间触发事件?

标签 c# wpf event-handling

我有一个简单的WPF页面,上面有几个radiobuttons,每个RadioButton均以检查事件处理程序注册,以便在更改选择时发生某些事情。默认情况下,我希望选择这些 RadioButtons 之一,因此我在 xaml 中将 IsChecked 属性设置为 True。像这样:

<RadioButton Checked="Radio_Checked" IsChecked="True">One</RadioButton>
<RadioButton Checked="Radio_Checked">Two</RadioButton>

问题在于,在 InitializeComponent 期间,IsChecked 属性会触发事件,这会导致空引用异常,因为我的事件处理程序尝试使用具有尚未初始化。

目前,我已经通过检查我的处理程序中的页面 IsInitialized 来解决这个问题,如下所示:

private void Radio_Checked(object sender, RoutedEventArgs e)
{
    if (this.IsInitialized)
    {
        if(MyRadioButton.IsChecked.GetValueOrDefault())
        {
            //SomeOtherElement is not initialized yet so it is null
            SomeOtherElement.Visibility = Visibility.Visible;
        }
    }
}

我想避免在我的所有事件处理程序中使用 if (this.IsInitialized),因为这是我在 WinForms 中从来不需要做的事情。

所以我的问题是,我可以用不同的方式处理这个问题,而不必向我所有的事件处理程序添加额外的代码吗?

最佳答案

老实说,我很惊讶你没有在你的处理程序中检查 null ......检查 IsInitialised 只是检查的一个细微变化对于 null。处理 null 值只是良好编程的一部分,让我们面对现实吧,它并没有真正添加很多代码。

所以为了回答你的问题,我会说'不,如果你不这样做,就没有办法在你的事件处理程序中检查 null(或 IsInitialised)希望发生 NulReferenceException'。

但是,在使用 MVVM 方法时,我们不会使用很多事件,而是尽可能使用数据绑定(bind)和 ICommand 实例。当我们确实需要使用事件时,我们通常在 Attached Properties 中使用它们,但您仍然需要检查 null 值。

关于c# - 如何避免在 InitializeComponent 期间触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19656320/

相关文章:

c# - 多值词典

c# - StackOverflowException 试图通过 WCF 服务将 Linq 查询结果作为列表返回

wpf - 如何更改 DataGridComboBoxColumn 中单元格值的前景色?

c++ - 强制 FLTK 在没有事件句柄的情况下重绘

c# - ASP .NET Button 事件处理程序不会在第一次单击时触发,而是在 PostBack 后的第二次单击时触发

c# - 如何在 ASP.NET MVC3 中配置区域

c# - 删除 .net 代码中的文字字符串

c# - 如何在 C# 应用程序启动时立即运行代码?

wpf - 寻找一些 WPF 布局建议

c# - 编写事件访问器时的多线程问题