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" />

这是我得到的错误: 在此处输入图像描述 Text reads: "Object reference not set to an instance of an object"

我知道还有另一个与此非常相似的问题 - 实际上有相同的错误 - 但是提供的解决方案(将变量初始化移动到 InitializeComponent() 方法调用之上)不适合我,因为我没有对象初始化。

非常感谢任何和所有帮助。

4

1 回答 1

6

发生这种情况是因为 pointsSettings_SelectionChanged 发生在 UI 完全初始化之前(您可以在调用堆栈中看到它来自 InitializeComponents() 调用)。因此标签尚未在 UI 中初始化,因此代码隐藏中指向该标签的变量为空。所以它实际上与另一个问题是相同的问题,但是初始化变量的是 WPF 框架,而不是你。

您的 XAML 是按顺序评估的,因此它ComboBox会在标签初始化之前点击并初始化它(包括最初选择的值)并触发 SelectionChanged 事件。您会注意到,如果您更改 XAML 的顺序以使Label位于上方ComboBox您将不会遇到问题,因为Label将在事件触发之前初始化。

为了解决这个问题,我建议向 pointsSettings_SelectionChanged 方法添加一个条件,以在 pointsAboveLabel 为空时返回:

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

并且由于您在 中对最初选择的值进行硬编码ComboBox,因此您可以对 . 的初始值进行硬Visibility编码Label

但是您的代码中还有另一个问题- the SelectedValueof theComboBox永远不会是字符串,因为您现在已经设置了它。将SelectedValue是一个ComboBoxItem. 为了查看您放入的字符串值ComboBoxItem,您需要查看该Content属性。所以你需要这样的东西:

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