我正在尝试根据组合框的选定值显示标签。我正在使用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()方法调用之上)并不适合我,因为我没有对象初始化。
任何和所有的帮助都得到了最热烈的赞赏。
答案 0 :(得分:5)
这是因为pointsSettings_SelectionChanged在UI完全初始化之前发生(您可以在callstack中看到它来自InitializeComponents()调用)。因此标签尚未在UI中初始化,因此指向该标签的代码隐藏中的变量为null。所以它与其他问题实际上是同一个问题,但是WPF框架正在初始化变量,而不是你。
您的XAML按顺序进行评估,因此它会命中ComboBox
并初始化它(包括最初选择的值)并在标签初始化之前触发SelectionChanged事件。您会注意到,如果您更改了XAML的顺序,以便Label
高于 ComboBox
,那么您就不会遇到问题,因为Label
将在事件被触发前初始化。
要解决这个问题,我建议在pointsSetings_SelectionChanged方法中添加一个条件,以便在pointsAboveLabel为null时返回:
private void pointsSettings_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(pointsAboveLabel == null) return;
//rest of code
}
由于您正在对ComboBox
中最初选择的值进行硬编码,因此您可以对Visibility
的初始Label
进行硬编码。
但是你的代码中还有另一个问题 - SelectedValue
的{{1}}永远不会是一个字符串,因为你现在已经设置好了。 ComboBox
将是SelectedValue
。要查看您放在ComboBoxItem
中的字符串值,您需要查看ComboBoxItem
属性。所以你需要这样的东西:
Content