1

コンボボックスの選択された値に基づいてラベルを表示しようとしています。VS2010を使用しています。

コードは次のとおりです。

private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (this.pointsSettings.SelectedValue.ToString() == "between")
        {
           pointsAboveLabel.Visibility = Visibility.Collapsed;
        }
        else
        {
           pointsAboveLabel.Visibility = Visibility.Visible;
        }
    }

そしてXAML:

 <ComboBox Name="pointsSettings" SelectionChanged="pointsSettings_SelectionChanged">
     <ComboBoxItem Content="between" />
     <ComboBoxItem Content="above" IsSelected="True" />
     <ComboBoxItem Content="below" />
 </ComboBox>
 <Label Content="points" Name="pointsAboveLabel" />
 <Label Content="and" Name="pointsBetweenLabel" Visibility="Collapsed" />

そして、これが私が得たエラーです: ここに画像の説明を入力してください テキストは読みます:「オブジェクト参照はオブジェクトのインスタンスに設定されていません」

これに非常によく似た別の質問があることを認識しています-実際には同じエラーがあります-しかし、提供されたソリューション(変数の初期化をInitializeComponent()メソッド呼び出しの上に移動する)は、オブジェクトの初期化がないため、私には適切ではありません。

ありとあらゆる助けが最も暖かく感謝されます。

4

1 に答える 1

6

これは、UIが完全に初期化される前にpointsSettings_SelectionChangedが発生するために発生します(コールスタックで、InitializeComponents()呼び出しからのものであることがわかります)。そのため、ラベルはUIで初期化されていないため、そのラベルを指すコードビハインドの変数はnullです。したがって、これは他の質問と実質的に同じ問題ですが、変数を初期化するのはWPFフレームワークであり、ユーザーではありません。

XAMLは順次評価されるため、XAMLがヒットしComboBoxて初期化され(最初に選択された値を含む)、ラベルが初期化される前にSelectionChangedイベントがトリガーされます。XAMLの順序を変更して、Labelになるようにすると、イベントが発生する前にが初期化されるComboBoxため、問題は発生しません。Label

これを解決するには、pointsAboveLabelがnullの場合に返す条件をpointsSettings_SelectionChangedメソッドに追加することをお勧めします。

private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if(pointsAboveLabel == null) return;
    //rest of code
}

また、で最初に選択した値をハードコーディングしているため、の初期値をハードコーディングできComboBoxます。VisibilityLabel

しかし、コードには別の問題があります。現在セットアップしているので、のは文字列SelectedValueにはComboBoxなりません。にSelectedValueなりますComboBoxItem。に入力している文字列値を確認するにはComboBoxItem、プロパティを確認する必要がありContentます。したがって、次のようなものが必要になります。

ComboBoxItem item = pointsSettings.SelectedValue as ComboBoxItem;
if(item.Content.ToString() == "between")
{
  ...
}
于 2013-02-26T17:16:06.920 に答える