当前一个Label中的值转换器到位时,在Button上抛出WPF null引用异常

时间:2013-03-05 16:57:30

标签: wpf data-binding nullreferenceexception

TLDR: 当另一个不相关的元素具有数据绑定和值转换器时,XAML解析任何按钮元素时抛出Nullreference异常。当按钮被注释掉,或者数据绑定被删除时,表单可以正常工作。

我有一个带有列表框的WPF UserControl,其中包含一个带有多个控件的DataTemplate。我还有一个bool到可见性值转换器,我在控件中的不同位置使用。我向控件添加了一个新的转换器静态引用(不同的bool到可见性值)并将其绑定到标签,突然应用程序在加载控件时崩溃。

我删除了绑定,一切都很好。转换器没有故障;我在它的构造函数和转换方法中放置了断点,它永远不会到达它。例外情况是解析XAML,而不是标签,但是在声明的第一个按钮处,它与标签100%无关。如果我从标签中删除值转换器绑定,XAML正确解析并且按钮没有问题。

但是,为了使事情变得复杂,如果我在XAML中注释掉该按钮和其他所有按钮,它也会正确解析,并且值转换器可以正常工作。

我错过了什么?

XAML:

<UserControl x:Class="Customer_Management.OpportunityControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
                     xmlns:l="clr-namespace:Customer_Management"
         d:DesignHeight="300" d:DesignWidth="300" MaxHeight="200" BorderBrush="DarkGray" BorderThickness="1" x:Name="ucOpp">
<UserControl.Resources>
    <l:NullToVisibilityConverter NullValue="Hidden" NonNullValue="Visible" x:Key="NullToHidden"></l:NullToVisibilityConverter>
    <l:BoolToVisibilityConverter TrueValue="Visible" FalseValue="Hidden" x:Key="TrueToVisible"></l:BoolToVisibilityConverter>
    <l:BoolToVisibilityConverter TrueValue="Hidden" FalseValue="Visible" x:Key="FalseToVisible"></l:BoolToVisibilityConverter>
</UserControl.Resources>
<ScrollViewer>
<ListBox Name="lbxOpps" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="DarkGray" BorderThickness="1">
                    <Grid>

                        <StackPanel>

                            <TextBlock Text="{Binding Path=Opportunity.Name}" Margin="0,1,3,1"></TextBlock>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=Opportunity.Amount, StringFormat=\{0:C\}}" Margin="0,1,3,1"></TextBlock>
                            <Button Name="btnFinishOrder" Click="btnFinishOrder_Click">Finish Order</Button>
                        </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock  Margin="0,1,3,1">Invoice #</TextBlock>
                                <TextBox Name="tbxInvoiceNumber" Text="{Binding Path=InvoiceNumber}"></TextBox>

                            </StackPanel>

                            <ListBox ItemsSource="{Binding Path=Batches}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel>
                                            <StackPanel Orientation="Horizontal">
                                                <Label FontWeight="Bold" Visibility="{Binding Path=IsOcc, Converter={StaticResource TrueToVisible}}">OCC #:</Label>

                                                <ComboBox Margin="0,0,0,0"  Name="cboLicense" SelectedValue="{Binding Path=SLicense}"  DisplayMemberPath="LicenseID" 
                                                                SelectedValuePath="LicenseID"  ItemsSource="{Binding ElementName=ucOpp, Path=Licenses}">
                                                </ComboBox>
                                                <!--<Button Margin="0,0,3,0" DataContext="{Binding ElementName=cboLicense}"  Click="Button_ClearContorl">X</Button>-->
                                                <Label Margin="0,0,3,0" >R #:</Label>
                                                <!--<Button ToolTip="Click to change" Name="btnLicFile" Click="Button_Click"  >LIC File</Button>-->
                                                <!--<Button Margin="0,0,3,0"  DataContext="{Binding ElementName=btnLicFile}" Click="Button_ClearContorl"  ToolTip="Clear">X</Button>-->
                                                <Label Margin="0,0,3,0" >P #:</Label>
                                                <ComboBox Margin="0,0,0,0" Name="cbxPNum" SelectedValue="{Binding Path=PNum}"   DisplayMemberPath="Name" 
                                                            SelectedValuePath="Id"  ItemsSource="{Binding ElementName=ucOpp, Path=Nums}">
                                                </ComboBox>
                                                <!--<Button Margin="0,0,3,0"  DataContext="{Binding ElementName=cbxPNum}"  Click="Button_ClearContorl" ToolTip="Clear">X</Button>-->
                                                <Label Margin="0,0,3,0" >U #:</Label>
                                                <ComboBox Margin="0,0,0,0"  Name="cbxUNum" SelectedValue="{Binding Path=UNum}" DisplayMemberPath="Name" 
                                                            SelectedValuePath="Id"  ItemsSource="{Binding ElementName=ucOpp, Path=Nums}">
                                                </ComboBox>
                                                <!--<Button Margin="0,0,3,0"   DataContext="{Binding ElementName=cbxUNum}" Click="Button_ClearContorl" ToolTip="Clear">X</Button>-->
                                            </StackPanel>

                                        </StackPanel>
                                    </DataTemplate>
                        </ListBox.ItemTemplate>

                    </ListBox>
                        </StackPanel>
                        <Label HorizontalAlignment="Stretch" Background="LawnGreen" FontSize="24" Opacity="0.8" VerticalAlignment="Stretch" Visibility="{Binding Path=IsProcessing, Converter={StaticResource TrueToVisible}}"></Label>
                        <Label HorizontalAlignment="Center" FontSize="24" VerticalAlignment="Center" Visibility="{Binding Path=IsProcessing, Converter={StaticResource TrueToVisible}}">Processing...</Label>
                    </Grid>
                </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>


</ListBox>
</ScrollViewer>

ValueConverter:

public sealed class BoolToVisibilityConverter : IValueConverter
{
    public Visibility TrueValue { get; set; }
    public Visibility FalseValue { get; set; }

    public BoolToVisibilityConverter()
    {
        // set defaults
        TrueValue = Visibility.Visible;
        FalseValue = Visibility.Collapsed;
    }

    public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
    {
        if (!(value is bool))
            return null;
        return (bool)value ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType,
            object parameter, CultureInfo culture)
    {
        if (Equals(value, TrueValue))
            return true;
        if (Equals(value, FalseValue))
            return false;
        return null;
    }
}

0 个答案:

没有答案