observablecollection类型的Dependencyproperty抛出异常

时间:2016-03-23 11:56:22

标签: c# wpf user-controls observablecollection dependency-properties

我正在制作一个基于列表框的名为“FileSelector”的用户控件。列表框中填充了一个observablecollection“FileDisplay”,其中包含从对话框中选择的文件名。

<ListBox x:Name="FileListBox" Template="{DynamicResource BaseListBoxControlStyle}" Grid.RowSpan="5" Grid.Row="1" Margin="0" ItemContainerStyle="{DynamicResource BaseListBoxItemStyle}" ItemsSource="{Binding DataContext.FileDisplay, ElementName=F_Selector, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <DockPanel>
                        <Button x:Name="ListDelete" Width="{Binding ActualHeight, ElementName=ListDelete}" Style="{DynamicResource BaseButtonStyle}" Margin="4,0,0,0" DockPanel.Dock="Right" Content="X" Click="FileDelete_Click"/>
                        <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
                            <ToggleButton x:Name="ListCheck" Width="{Binding ActualHeight, ElementName=ListCheck}" Style="{DynamicResource BaseToggleButtonStyle}" Margin="0,0,4,0" Checked="File_Checked"  Unchecked="File_Unchecked" />
                            <TextBlock Text="{Binding ., Converter={StaticResource PathToFileName}}" TextTrimming="CharacterEllipsis"/>
                        </StackPanel>
                    </DockPanel>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

当选中项目中包含的切换按钮时,我想将项目的内容添加到observablecollection类型的dependencyproperty。

private void File_Checked(object sender, RoutedEventArgs e)
{
    ToggleButton btn = (ToggleButton)sender;
    int index = FileListBox.Items.IndexOf(btn.DataContext);
    FileChecked[index] = true;
    FileSelected.Add(FileDisplay[index]);
}

dependencyproperty:

    public static readonly DependencyProperty FileSelectedProperty =
    DependencyProperty.Register("FileSelected", typeof(ObservableCollection<string>), typeof(FileSelector));
    [Bindable(true)]
    public ObservableCollection<string> FileSelected
    {
        get { return (ObservableCollection<string>)this.GetValue(FileSelectedProperty); }
        set { this.SetValue(FileSelectedProperty, value); }
    }

此外,FileChecked是一个observablecollection,用于跟踪检查哪个元素以供以后使用。

所有编译都很好但是当我检查其中一个togglebutton时会抛出这个错误:

Access violation at address 00007FFA2981CC85. Read of address 0000000000000000.

值得注意的是,如果我将DependencyProperty FileSelected更改为一个简单的observablecollection,则没有问题,但我不想这样做,因为我以后无法绑定它。

知道为什么吗?谢谢

EDIT ---- 在使用visualstudio调试器进行了一些测试之后,我发现每当我点击一个togglebutton时,名为“FileSelected”的dependencyproperty为null,而它应该添加“FileDisplay [index]”,即使我用任何类型的字符串替换最新的。 ..

1 个答案:

答案 0 :(得分:0)

我有点困惑。你这样说:

  

值得注意的是,如果我将DependencyProperty FileSelected更改为一个简单的observablecollection,没有问题,但我不想这样做,因为我以后无法绑定它。

但在您的示例中,FileSelected是一个ObservableCollection。 FileSelected最初打算采用什么数据类型?

  

在使用visualstudio调试器进行了一些测试后,我发现每当我点击一个togglebutton时,依赖属性名为&#34; FileSelected&#34;是null,而它应该被添加&#34; FileDisplay [index]&#34;即使我用任何一种字符串替换最新的......

在不知道其真实数据类型的情况下,没有办法告诉为什么FileSelected为空。是一次只选择一个文件还是多个文件?

如果FileSelected 假设是OC,它可能是空的,因为你没有在任何地方初始化它,或者b)你没有&#39; t正确初始化。

您可以发布初始化样本吗?