Wpf установка событий во вложенном списке генерирует исключение нулевой ссылки - PullRequest
1 голос
/ 28 октября 2011

Я пытаюсь перетащить файл в текстовое поле, чтобы задать содержимое текстового поля с путем к файлу (второй DataTemplate). Поэтому я добавил событие DragOver в свой textBox. Но я получаю исключение Null. Я перепробовал много других событий и получил ту же ошибку. В первом dataTemplate события работают нормально.

Это может быть потому, что мое текстовое поле находится во вложенном списке. Но я не уверен.

Есть идеи?

    <ListBox ItemsSource="{Binding Model.Attributes, Mode=TwoWay}" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0" BorderThickness="0" VerticalContentAlignment="Stretch" PreviewKeyDown="ListBox_PreviewKeyDown">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type local:TransformModel}">
            <Expander Header="Transform" VerticalAlignment="Top" d:LayoutOverrides="Width" FontSize="10.667" HorizontalAlignment="Stretch" IsExpanded="{Binding DataContext.Model.TransformIsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
                <StackPanel HorizontalAlignment="Stretch">
                    <Grid HorizontalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="14"/>
                            <ColumnDefinition Width="0.333*"/>
                            <ColumnDefinition Width="14"/>
                            <ColumnDefinition Width="0.333*"/>
                            <ColumnDefinition Width="14"/>
                            <ColumnDefinition Width="0.333*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="0.215*"/>
                            <RowDefinition Height="0.785*"/>
                        </Grid.RowDefinitions>
                        <TextBlock Margin="4,0" TextWrapping="Wrap" Text="Position" d:LayoutOverrides="Width, Height" Grid.ColumnSpan="6" FontSize="10.667"/>   
                        <TextBlock TextWrapping="Wrap" Text="X" Grid.Row="1" VerticalAlignment="Top" Margin="4,0,0,0" d:LayoutOverrides="Width"/>
                        <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Position.X, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0,0,-0.001,0" d:LayoutOverrides="Width" GotFocus="TextGotFocus" PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton" />
                        <TextBlock TextWrapping="Wrap" Text="Y" Grid.Row="1" VerticalAlignment="Top" Margin="3.998,0,4.562,0" Grid.Column="2" d:LayoutOverrides="Width"/>
                        <TextBox Grid.Column="3" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Position.Y, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0" GotFocus="TextGotFocus" PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton"/>
                        <TextBlock TextWrapping="Wrap" Text="Z" Grid.Row="1" VerticalAlignment="Top" Margin="3.999,0,4.344,0" Grid.Column="4" d:LayoutOverrides="Width"/>
                        <TextBox Grid.Column="5" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Position.Z, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0,0,4,0" GotFocus="TextGotFocus" PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton"/>
                    </Grid>
                    <Grid HorizontalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="14"/>
                            <ColumnDefinition Width="0.333*"/>
                            <ColumnDefinition Width="14"/>
                            <ColumnDefinition Width="0.333*"/>
                            <ColumnDefinition Width="14"/>
                            <ColumnDefinition Width="0.333*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="0.215*"/>
                            <RowDefinition Height="0.785*"/>
                        </Grid.RowDefinitions>
                        <TextBlock Margin="4,0" TextWrapping="Wrap" Text="Size" d:LayoutOverrides="Width, Height" Grid.ColumnSpan="6" FontSize="10.667"/>
                        <TextBlock TextWrapping="Wrap" Text="X" Grid.Row="1" VerticalAlignment="Top" Margin="4,0,0,0" d:LayoutOverrides="Width"/>
                        <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Size.X, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0,0,-0.001,0" d:LayoutOverrides="Width"  GotFocus="TextGotFocus" PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton"/>
                        <TextBlock TextWrapping="Wrap" Text="Y" Grid.Row="1" VerticalAlignment="Top" Margin="3.998,0,4.562,0" Grid.Column="2" d:LayoutOverrides="Width"/>
                        <TextBox Grid.Column="3" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Size.Y, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0" GotFocus="TextGotFocus" PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton"/>
                        <TextBlock TextWrapping="Wrap" Text="Z" Grid.Row="1" VerticalAlignment="Top" Margin="3.999,0,4.344,0" Grid.Column="4" d:LayoutOverrides="Width"/>
                        <TextBox Grid.Column="5" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Size.Z, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0,0,4,0" GotFocus="TextGotFocus" PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton"/>
                    </Grid>
                    <Separator Height="1" Margin="5,2,5,0"/>
                </StackPanel>
            </Expander>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:UnknownModel}">
            <Expander Header="Miscellaneous" VerticalAlignment="Top" d:LayoutOverrides="Width" FontSize="10.667" HorizontalAlignment="Stretch" IsExpanded="{Binding DataContext.Model.TransformIsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
                <StackPanel HorizontalAlignment="Stretch">
                    <ListBox Grid.Row="1" VerticalAlignment="Top" ItemsSource="{Binding Attributs}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0" BorderThickness="0">
                        <ListBox.Resources>
                            <DataTemplate DataType="{x:Type local:PropertiesAssetsModel}">
                                <Grid d:DesignWidth="682.4" Margin="0,0,0,4" d:DesignHeight="144">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="0.163*"/>
                                        <ColumnDefinition Width="0.837*"/>
                                     </Grid.ColumnDefinitions>
                                     <TextBlock TextWrapping="Wrap" VerticalAlignment="Center" d:LayoutOverrides="Width" Text="Assets" Margin="0,0,-0.003,0"/>
                                     <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Value, Mode=TwoWay}" VerticalAlignment="Top" FontSize="8" Margin="0,0,-0.001,0" d:LayoutOverrides="Width" AllowDrop="True" DragOver="AssetPathDragOvers"/>
                                </Grid>                           
                            </DataTemplate>
                        </ListBox.Resources>
                    </ListBox>
                    <Separator Height="1" Margin="5,2,5,0"/>
                </StackPanel>
            </Expander>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

Ответы [ 3 ]

1 голос
/ 31 января 2012

Спасибо,

Вложенные шаблоны данных не работают должным образом с .NET 4.0

Подробнее об этой ошибке можно прочитать: Официальный отчет об ошибках

Мой обходной путь:

Создание собственного селектора шаблонов данных:

public class TemplateSelector : DataTemplateSelector
{
    public DataTemplate UnknownTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item,
               DependencyObject container)
    {
        if (item is PropertiesUnkownModel)
        {
            return UnknownTemplate;
        }
        return UnknownTemplate;
    }
}

Селектор шаблонов в xaml:

<view:TemplateSelector x:Key="templateSelector" UnknownTemplate="{StaticResource PropertiesUnkownModel}"/>

и способ его использования:

<ListBox Grid.Row="1" VerticalAlignment="Top" ItemsSource="{Binding Attributs}" ItemTemplateSelector="{DynamicResource templateSelector}"/>
1 голос
/ 05 января 2012

Я только что столкнулся с такой же проблемой (моя была с comboBox и LostFocus event).Я могу обойти это, переместив бит Event handling в стиль в моем представлении ResourceDictionary.

Попробуйте что-то вроде этого:

    <ResourceDictionary>
        <Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
            <EventSetter Event="DragOver" Handler="AssetPathDragOvers"/>
        </Style>
    </ResourceDictionary>

    <TextBox Style="{StaticResource ComboBoxStyle}" ...
0 голосов
/ 03 октября 2012

Для исправления этой ошибки доступно исправление .

...