4

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

<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 中从未做过的事情。

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

4

3 回答 3

3

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

因此,要回答您的问题,我会说“不,如果您不希望s 发生,则无法在事件处理程序中检查null(or ) ”。IsInitialisedNulReferenceException

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

于 2013-10-29T11:09:42.447 回答
1

您可以从 xaml 中删除事件处理程序并在之后添加它InitializeComponent();

radioButton1.Checked+=Radio_Checked;
于 2013-10-29T11:27:12.073 回答
0

每个元素都是按照它在 XAML 中的顺序创建的。

<RadioButton x:Name="MyRadioButton" ...>
<YourElement x:Name="SomeOtherElement" ...>

我假设在您的 XAML 中 RadioButton 放置在您引用的其他元素之前。在 InitializeComponent 中创建元素时,会设置所有属性并触发所有事件。所以 SomeOtherElement 在那一刻不存在。解决方案很简单:

<YourElement x:Name="SomeOtherElement" ...>
<RadioButton x:Name="MyRadioButton"...>

在 RadioButtons 之前设置 SomeOtherElement。如果有理由不切换 XAML 中元素的顺序,请使用已经提到的空检查:

if (SomeOtherElement != null)
{
    SomeOtherElement.Visibility = Visibility.Visible;
}
于 2016-05-19T16:23:26.750 回答