我有一个简单的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/