【问题标题】:Combobox SelectedItem DataBinding NullReference Exception组合框选定项数据绑定空引用异常
【发布时间】:2013-07-18 20:32:57
【问题描述】:

我现在对组合框有点失望,希望有人能回答我的问题。问题出在 SelectedItem 上。当我在调试器中运行我的应用程序时,如果我在 ComboBox 中输入与项目中的项目(即 a、b 或 c)匹配的文本,然后删除该文本,它将引发空引用异常。如果我在 ComboBox 中输入文本并且与 Items 中的 Item(ie.. z) 不匹配,然后删除该文本,它不会崩溃。此行为仅在调试器中发生。如果我在外面运行应用程序,我不会崩溃。我正在使用 mvvmlight takeit 但我不认为它与此有关。我的代码在下面

查看:

<ComboBox IsEditable="True"
              VerticalAlignment="Top"
              ItemsSource="{Binding Items}"
              DisplayMemberPath="Name"
              SelectedItem="{Binding Item,Mode=TwoWay}"/>

型号:

public class Item
{
    public string Name { get; set; }
    public int Id { get; set; }
}

虚拟机:

public MainViewModel()
    {
        Items = new List<Item>
          {
            new Item {Name="a", Id=0},
            new Item {Name="b", Id=1},
            new Item {Name="c", Id=2},
          };
    }

    /// <summary>
    /// The <see cref="Items" /> property's name.
    /// </summary>
    public const string ItemsPropertyName = "Items";

    private List<Item> _items;

    /// <summary>
    /// Sets and gets the Items property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public List<Item> Items
    {
        get
        {
            return _items;
        }
        set
        {
            Set(ItemsPropertyName, ref _items, value);
        }
    }

    /// <summary>
    /// The <see cref="Item" /> property's name.
    /// </summary>
    public const string ItemPropertyName = "Item";

    private Item _item;

    /// <summary>
    /// Sets and gets the Item property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public Item Item
    {
        get
        {
            return _item;
        }
        set
        {
            Set(ItemPropertyName, ref _item, value);
        }
    }

【问题讨论】:

  • 当您说您正在输入和删除项目时,您能再解释一下您所指的内容吗?这是在用户界面中吗?还是在代码中?还是...?
  • 当我在调试器中运行应用程序时,组合框属性 IsEditable="True"。因此我可以从组合框中添加和删除文本。抱歉,我将进行编辑以明确说明。
  • 乍一看,您的代码看起来很完美,应该一次性运行。所以我尝试了它,它按预期工作。所以你提供的代码没有问题。
  • 尽管我很愿意相信 Nitesh,但您是否尝试过从调试器运行它?我在家里使用 VS2012,在工作中使用 VS2010,两者都做同样的事情。如果我在没有调试的情况下开始,它可以工作。如果我从调试开始,它会崩溃。输入“a”然后退格,你会得到一个空引用异常。
  • 请发布包含所有堆栈跟踪的完整异常。

标签: c# wpf data-binding


【解决方案1】:

这是 .NET Framework 4(和 .NET 4.5,不在 .NET 3.0 和 .NET 3.5 中)中的错误。

方法PresentationFramework.dll!MS.Internal.Data.PropertyPathWorker.DetermineWhetherDBNullIsValid(object item) 导致问题。

用.NET Reflector查看,其代码如下:

private bool DetermineWhetherDBNullIsValid(object item)
{
    PropertyInfo info;
    PropertyDescriptor descriptor;
    DependencyProperty property;
    DynamicPropertyAccessor accessor;
    this.SetPropertyInfo(this._arySVS[this.Length - 1].info, out info, out descriptor, out property, out accessor);
    string columnName = (descriptor != null) ? descriptor.Name : ((info != null) ? info.Name : null);
    object arg = ((columnName == "Item") && (info != null)) ? this._arySVS[this.Length - 1].args[0] : null;
    return SystemDataHelper.DetermineWhetherDBNullIsValid(item, columnName, arg);
}

问题在以下行:

object arg = ((columnName == "Item") && (info != null)) ? this._arySVS[this.Length - 1].args[0] : null;

代码假定如果columnName"Item",那么属性是索引器并尝试通过args[0] 访问它的第一个参数,这就是NullReferenceException 出现的地方,因为argsnull,因为属性不是索引器。它恰好被命名为"Item"

.NET 实现者应该在info 上使用PropertyInfo.GetIndexParameters(),如果返回的数组不包含零元素,请确定属性是索引器。或者使用Binding.IndexerName 进行检查(Binding.IndexerName 的值为"Item[]")。

为什么只在 Visual Studio 调试器中出现问题要微妙得多,它隐藏在以下方法中: PresentationFramework.dll!MS.Internal.Data.PropertyPathWorker.DetermineWhetherDBNullIsValid()

下面是反汇编代码:

private void DetermineWhetherDBNullIsValid()
{
    bool flag = false;
    object item = this.GetItem(this.Length - 1);
    if ((item != null) && AssemblyHelper.IsLoaded(UncommonAssembly.System_Data))
    {
        flag = this.DetermineWhetherDBNullIsValid(item);
    }
    this._isDBNullValidForUpdate = new bool?(flag);
}

由于item 变量不会为空(它实际上是WeakReference 的实例,其中包含MainViewModel 实例),因此调用失败方法DetermineWhetherDBNullIsValid(item) 的唯一条件是System.Data.dll 程序集已加载,使用 AssemblyHelper.IsLoaded(UncommonAssembly.System_Data) 检查。

Visual Studio 调试器将始终加载 System.Data.dll,因为项目正在引用它,尽管它没有使用它。 在 Visual Studio 调试器之外,System.Data.dll 仅在使用时才被加载,这是永远不会的,这就是应用程序在 Visual Studio 之外不会失败的原因。

您有以下选项可以解决此问题:

  1. 将绑定到ComboBox.SelectedItem 的属性重命名为"Item" 以外的其他名称,这样有缺陷的.NET 实现就不再假定该属性是索引器。
  2. 从项目引用中删除 System.Data.dll,这样即使在 Visual Studio 调试器中也不会加载它。

我发现选项 2 更脆弱,因为可能会出现 System.Data.dll 必须加载的情况,要么直接由您的应用程序加载,要么由其他加载的程序集间接加载。

所以我会选择选项 1。

【讨论】:

  • 确认这两个选项都按描述工作 - 在针对 .NET 4.5 的 VS2012 上进行了测试。干得好@Stipo,感谢分享!这个故事的寓意 - 从不将您的任何视图模型的属性命名为“Item”:)
  • 天哪……你救了我一夜!!
  • 非常感谢,你救了我的命!
  • 这是我遇到过的最奇怪的 .NET 错误之一。非常感谢您的回答,因为我不知所措。
【解决方案2】:

我能够在我这边重现这一点。将此添加到您的组合框代码中:

IsTextSearchEnabled="False"

不管怎样,还有谁对这个问题感兴趣,这个异常的stacktrace如下

PresentationFramework.dll!MS.Internal.Data.PropertyPathWorker.DetermineWhetherDBNullIsValid(object item) + 0xc7 bytes
PresentationFramework.dll!MS.Internal.Data.PropertyPathWorker.DetermineWhetherDBNullIsValid() + 0x64 字节
PresentationFramework.dll!MS.Internal.Data.PropertyPathWorker.IsDBNullValidForUpdate.get() + 0x2e 字节 PresentationFramework.dll!MS.Internal.Data.ClrBindingWorker.IsDBNullValidForUpdate.get() + 0xa 字节
PresentationFramework.dll!System.Windows.Data.BindingExpression.ConvertProposedValue(对象值) + 0x177 字节
PresentationFramework.dll!System.Windows.Data.BindingExpressionBase.UpdateValue() + 0x92 字节
PresentationFramework.dll!System.Windows.Data.BindingExpression.UpdateOverride() + 0x3d 字节
PresentationFramework.dll!System.Windows.Data.BindingExpressionBase.Update() + 0x20 字节
PresentationFramework.dll!System.Windows.Data.BindingExpressionBase.ProcessDirty() + 0x2f 字节 PresentationFramework.dll!System.Windows.Data.BindingExpressionBase.Dirty() + 0x40 字节
PresentationFramework.dll!System.Windows.Data.BindingExpressionBase.SetValue(System.Windows.DependencyObject d, System.Windows.DependencyProperty dp, 对象值) + 0x24 字节
WindowsBase.dll!System.Windows.DependencyObject.SetValueCommon(System.Windows.DependencyProperty dp,对象值,System.Windows.PropertyMetadata 元数据,bool coerceWithDeferredReference,bool coerceWithCurrentValue,System.Windows.OperationType operationType,bool isInternal)+ 0x3c4 字节
WindowsBase.dll!System.Windows.DependencyObject.SetCurrentValueInternal(System.Windows.DependencyProperty dp, 对象值) + 0x35 字节
PresentationFramework.dll!System.Windows.Controls.Primitives.Selector.UpdatePublicSelectionProperties() + 0x13f 字节
PresentationFramework.dll!System.Windows.Controls.Primitives.Selector.SelectionChanger.End() + 0x80 字节
PresentationFramework.dll!System.Windows.Controls.Primitives.Selector.SelectionChanger.SelectJustThisItem(System.Windows.Controls.ItemsControl.ItemInfo info, bool assumeInItemsCollection) + 0x145 字节
PresentationFramework.dll!System.Windows.Controls.Primitives.Selector.OnSelectedIndexChanged(System.Windows.DependencyObject d, System.Windows.DependencyPropertyChangedEventArgs e) + 0xd9 字节
WindowsBase.dll!System.Windows.DependencyObject.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs e) + 0x4d 字节 PresentationFramework.dll!System.Windows.FrameworkElement.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs e) + 0x50 字节
WindowsBase.dll!System.Windows.DependencyObject.NotifyPropertyChange(System.Windows.DependencyPropertyChangedEventArgs 参数) + 0x3b 字节
WindowsBase.dll!System.Windows.DependencyObject.UpdateEffectiveValue(System.Windows.EntryIndex entryIndex, System.Windows.DependencyProperty dp, System.Windows.PropertyMetadata 元数据, System.Windows.EffectiveValueEntry oldEntry, ref System.Windows.EffectiveValueEntry newEntry, bool coerceWithDeferredReference , bool coerceWithCurrentValue, System.Windows.OperationType operationType) + 0x757 字节
WindowsBase.dll!System.Windows.DependencyObject.SetValueCommon(System.Windows.DependencyProperty dp,对象值,System.Windows.PropertyMetadata 元数据,bool coerceWithDeferredReference,bool coerceWithCurrentValue,System.Windows.OperationType operationType,bool isInternal)+ 0x2ea 字节
WindowsBase.dll!System.Windows.DependencyObject.SetCurrentValueInternal(System.Windows.DependencyProperty dp, 对象值) + 0x35 字节
PresentationFramework.dll!System.Windows.Controls.ComboBox.TextUpdated(string newText, bool textBoxUpdated) + 0x26e 字节
PresentationFramework.dll!System.Windows.Controls.ComboBox.OnEditableTextBoxTextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) + 0x2e 字节 PresentationFramework.dll!System.Windows.Controls.TextChangedEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget) + 0x2c bytes
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate 处理程序,对象目标)+ 0x33 字节
PresentationCore.dll!System.Windows.RoutedEventHandlerInfo.InvokeHandler(对象目标,System.Windows.RoutedEventArgs routedEventArgs) + 0x44 字节
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(对象源,System.Windows.RoutedEventArgs 参数,bool reRaised)+ 0x1a8 字节
PresentationCore.dll!System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject 发送方,System.Windows.RoutedEventArgs 参数)+ 0x73 字节
PresentationCore.dll!System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs e) + 0x29 字节 PresentationFramework.dll!System.Windows.Controls.Primitives.TextBoxBase.OnTextChanged(System.Windows.Controls.TextChangedEventArgs e) + 0x5 字节
PresentationFramework.dll!System.Windows.Controls.Primitives.TextBoxBase.OnTextContainerChanged(object sender, System.Windows.Documents.TextContainerChangedEventArgs e) + 0xe0 字节
PresentationFramework.dll!System.Windows.Controls.TextBox.OnTextContainerChanged(object sender, System.Windows.Documents.TextContainerChangedEventArgs e) + 0x17d 字节 PresentationFramework.dll!System.Windows.Documents.TextContainer.EndChange(bool skipEvents) + 0xb6 字节
PresentationFramework.dll!System.Windows.Documents.TextContainer.System.Windows.Documents.ITextContainer.EndChange(bool skipEvents) + 0xb 字节 PresentationFramework.dll!System.Windows.Documents.TextRangeBase.EndChange(System.Windows.Documents.ITextRange thisRange, bool disableScroll, bool skipEvents) + 0x59 字节 PresentationFramework.dll!System.Windows.Documents.TextRange.System.Windows.Documents.ITextRange.EndChange(bool disableScroll, bool skipEvents) + 0x11 字节
PresentationFramework.dll!System.Windows.Documents.TextRange.ChangeBlock.System.IDisposable.Dispose() + 0x15 字节
PresentationFramework.dll!System.Windows.Documents.TextEditorTyping.OnDelete(对象发送者,System.Windows.Input.ExecutedRoutedEventArgs args) + 0x1a7 字节
PresentationCore.dll!System.Windows.Input.CommandBinding.OnExecuted(object sender, System.Windows.Input.ExecutedRoutedEventArgs e) + 0x65 bytes PresentationCore.dll!System.Windows.Input.CommandManager.ExecuteCommandBinding(object sender, System.Windows.Input.ExecutedRoutedEventArgs e, System.Windows.Input.CommandBinding commandBinding) + 0x92 字节
PresentationCore.dll!System.Windows.Input.CommandManager.FindCommandBinding(System.Windows.Input.CommandBindingCollection commandBindings,对象发送者,System.Windows.RoutedEventArgs e,System.Windows.Input.ICommand 命令,布尔执行)+ 0x105 字节
PresentationCore.dll!System.Windows.Input.CommandManager.FindCommandBinding(object sender, System.Windows.RoutedEventArgs e, System.Windows.Input.ICommand command, bool execute) + 0x15e bytes PresentationCore.dll!System.Windows.Input.CommandManager.OnExecuted(object sender, System.Windows.Input.ExecutedRoutedEventArgs e) + 0x25 字节 PresentationCore.dll!System.Windows.UIElement.OnExecutedThunk(object sender, System.Windows.Input.ExecutedRoutedEventArgs e) + 0x46 字节
PresentationCore.dll!System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler(System.Delegate genericHandler, object target) + 0x3c bytes
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate 处理程序,对象目标)+ 0x33 字节
PresentationCore.dll!System.Windows.RoutedEventHandlerInfo.InvokeHandler(对象目标,System.Windows.RoutedEventArgs routedEventArgs) + 0x44 字节
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(对象源,System.Windows.RoutedEventArgs 参数,bool reRaised)+ 0x1a8 字节
PresentationCore.dll!System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject 发送方,System.Windows.RoutedEventArgs 参数)+ 0x73 字节
PresentationCore.dll!System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs args) + 0x3d 字节
PresentationCore.dll!System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs args, bool trust) + 0x40 字节
PresentationCore.dll!System.Windows.Input.RoutedCommand.ExecuteImpl(对象参数,System.Windows.IInputElement 目标,bool userInitiated)+ 0x105 字节
PresentationCore.dll!System.Windows.Input.RoutedCommand.ExecuteCore(object parameter, System.Windows.IInputElement target, bool userInitiated) + 0x59 bytes PresentationCore.dll!System.Windows.Input.CommandManager.TranslateInput(System.Windows.IInputElement targetElement, System.Windows.Input.InputEventArgs inputEventArgs) + 0x59b 字节
PresentationCore.dll!System.Windows.UIElement.OnKeyDownThunk(object sender, System.Windows.Input.KeyEventArgs e) + 0x52 字节
PresentationCore.dll!System.Windows.Input.KeyEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget) + 0x2c 字节
PresentationCore.dll!System.Windows.RoutedEventArgs.InvokeHandler(System.Delegate 处理程序,对象目标)+ 0x33 字节
PresentationCore.dll!System.Windows.RoutedEventHandlerInfo.InvokeHandler(对象目标,System.Windows.RoutedEventArgs routedEventArgs) + 0x44 字节
PresentationCore.dll!System.Windows.EventRoute.InvokeHandlersImpl(对象源,System.Windows.RoutedEventArgs 参数,bool reRaised)+ 0x1a8 字节
PresentationCore.dll!System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject 发送方,System.Windows.RoutedEventArgs 参数)+ 0x73 字节
PresentationCore.dll!System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs args) + 0x3d 字节
PresentationCore.dll!System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs args, bool trust) + 0x40 字节
PresentationCore.dll!System.Windows.Input.InputManager.ProcessStagingArea() + 0x1f8 字节
PresentationCore.dll!System.Windows.Input.InputManager.ProcessInput(System.Windows.Input.InputEventArgs 输入) + 0x45 字节 PresentationCore.dll!System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport inputReport) + 0x62 字节
PresentationCore.dll!System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(System.IntPtr hwnd, System.Windows.Input.InputMode 模式, int 时间戳, System.Windows.Input.RawKeyboardActions 动作, int scanCode, bool isExtendedKey, bool isSystemKey, int virtualKey) + 0xee 字节 PresentationCore.dll!System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(参考 System.Windows.Interop.MSG 味精,参考布尔处理)+ 0xac 字节
PresentationCore.dll!System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(参考 System.Windows.Interop.MSG msg,System.Windows.Input.ModifierKeys 修饰符)+ 0x94 字节
PresentationCore.dll!System.Windows.Interop.HwndSource.OnPreprocessMessage(object param) + 0x12c bytes
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate 回调,对象 args,int numArgs) + 0x56 字节 WindowsBase.dll!MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象源,System.Delegate 方法,对象 args,int numArgs,System.Delegate catchHandler)+ 0x3a 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority 优先级,System.TimeSpan 超时,System.Delegate 方法,对象参数,int numArgs)+ 0x10e 字节 WindowsBase.dll!System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority 优先级,System.Delegate 方法,对象 arg) + 0x3e 字节
PresentationCore.dll!System.Windows.Interop.HwndSource.OnPreprocessMessageThunk(ref System.Windows.Interop.MSG msg, ref bool 处理) + 0x93 字节
PresentationCore.dll!System.Windows.Interop.HwndSource.WeakEventPreprocessMessage.OnPreprocessMessage(参考 System.Windows.Interop.MSG 味精,参考布尔处理)+ 0x33 字节
WindowsBase.dll!System.Windows.Interop.ComponentDispatcherThread.RaiseThreadMessage(ref System.Windows.Interop.MSG msg) + 0x3c 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame 帧) + 0x9a 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame 帧) + 0x49 字节
WindowsBase.dll!System.Windows.Threading.Dispatcher.Run() + 0x4b 字节
PresentationFramework.dll!System.Windows.Application.RunDispatcher(对象忽略) + 0x17 字节
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window 窗口) + 0x6f 字节 PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window 窗口) + 0x26 字节 PresentationFramework.dll!System.Windows.Application.Run() + 0x1b 字节 WpfApplication1.exe!WpfApplication1.App.Main() + 0x59 字节 C# [本机到托管转换]
[托管到本地转换]
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6b 字节
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x27 字节
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态) + 0x6f 字节
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) + 0xa7 字节
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) + 0x16 bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态) + 0x41 字节
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 字节
[本机到托管转换]

【讨论】:

  • 感谢您抽出宝贵时间查看此内容。将此设置为 False 确实会停止崩溃,但是,这还需要您从 ComboBox 中选择一个项目来更新 SelectedItem Binding 而不是仅仅能够输入它。就像我说的那样,如果您在没有调试器的情况下运行它,一切似乎按预期工作。一直在严厉批评这种行为,希望有人能告诉我为什么。
【解决方案3】:

试试这个:

  1. 写一个转换器

    public class NullToItemConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return new Item();
            else
                return value;
        }
    }
    
  2. 在 XAML 中

    <Window.Resources>
        <local:NullToItemConverter x:Key="nullToItemConverter"/>
    </Window.Resources
    

    ...

    <ComboBox IsEditable="True"
          VerticalAlignment="Top"
          ItemsSource="{Binding Items}"
          DisplayMemberPath="Name"
          SelectedItem="{Binding Item, Mode=TwoWay , Converter={StaticResource nullToItemConverter}}"/>
    

【讨论】:

  • 感谢您抽出宝贵时间查看此内容。我知道这将阻止崩溃。但是,这会将您的视图模型中的 Item 作为新 Item 留下。我没有理由看到 Item 不能设置为 null。就像我上面所说的,如果你在没有调试的情况下运行它,你将不会遇到崩溃。我感兴趣的是为什么会发生这种情况,而不是真正的解决方法。
【解决方案4】:

我通过将访问修饰符设为public解决了这个问题,这样它就可以在双向中绑定。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多