2013-10-29 61 views
2

我有一個簡單的WPF頁面,有幾個RadioButtons,每個RadioButton都註冊了一個Checked事件處理程序,這樣當選擇被改變時會發生一些事情。默認情況下,我想要選擇其中一個RadioButton,因此我已將IsChecked屬性設置爲xaml中的True。事情是這樣的:如何避免在InitializeComponent期間觸發事件?

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

這樣做的問題是,在InitializeComponentIsChecked屬性將導致事件觸發,這會導致空引用異常,因爲我的事件處理程序試圖使用尚未初始化的元素。

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),因爲這是我:

目前我已經解決這個問題通過檢查頁面IsInitialized我的處理程序中,如下所示得到從未在WinForms中做過。

所以我的問題是,我可以處理這個不同的方式,而不必添加額外的代碼給我所有的事件處理者?

+1

你應該看一看,它可以與WPF MVVM模式,可以解決很多這些問題。 – nvoigt

+0

@nvoigt:是的,我有一本WPF的書,我真的需要閱讀。我相信它包含了相當多的關於MVVM模式 – musefan

+0

您可能想看到此鏈接: http://stackoverflow.com/questions/2518231/wpf-getting-control-null-reference-during-initializecomponent –

回答

3

說實話,我很驚訝你沒有在你的處理程序中檢查null ......檢查IsInitialised只是檢查null時的一個小的變化。處理null值只是好的編程的一部分,讓我們面對它,它不是真的添加了很多代碼。

因此,要回答你的問題,我會說「不,有沒有辦法解決檢查你的事件處理程序null(或IsInitialised)如果你不想NulReferenceException s到發生」。然而,當使用MVVM方法時,我們不使用許多事件,而是傾向於使用數據綁定,並且儘可能使用數據綁定。當我們需要使用事件時,我們通常在Attached Properties中使用它們,但在那裏您仍然需要檢查null的值。

+1

我不喜歡沒有看到需要檢查null。該元素應該始終可用,並且如果它是空的,則會更喜歡該異常,因爲這是非常意外的,並且如果它發生就應該被解決。似乎我需要離開並調查MVVM,並考慮如何改變我目前的方法來適應這種模式。 – musefan

0

您可以從XAML中刪除的事件處理程序和後InitializeComponent();

radioButton1.Checked+=Radio_Checked; 
0

每個元素都在爲了它在你的XAML創建添加。

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

我假設在您的XAML中,RadioButton放置在您引用的其他元素之前。在InitializeComponent中創建一個元素時,所有的屬性都被設置,並且所有的事件都被觸發。所以SomeOtherElement在那一刻不存在。 解決的辦法是安靜簡單:你的單選按鈕之前

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

集SomeOtherElement。 如果有理由不切換你的元素的順序在XAML中,然後用已經提到的空檢查:

if (SomeOtherElement != null) 
{ 
    SomeOtherElement.Visibility = Visibility.Visible; 
} 
相關問題