【问题标题】:IMapChangedEventArgs<string> always null targeting Windows 10, Version 2004IMapChangedEventArgs<string> 始终为空,面向 Windows 10,版本 2004
【发布时间】:2020-11-16 01:41:11
【问题描述】:

谁能告诉我为什么 IMapChangedEventArgs 值在面向 Windows 10 版本 2004 (10.0; Build 19041) 的 C# UWP 应用程序中总是返回 null?

我正在尝试使用具有此签名的处理程序处理由 ApplicationDataContainerSettings 对象引发的 MapChanged 事件

SettingsMapChanged(IObservableMap<string, object> sender, IMapChangedEventArgs<string> @event)

下面代码的调试输出为:

[One] = One
Null argument
Empty Map
Null argument
Empty Map
Null argument
[Two] = Two

这表明 sender 正确返回了对更新地图的引用,但 MapChangedEventArgs 值始终为空。我已经尝试过转换为 ApplicationDataContainerSettings 的替代方法,但没有成功。任何建议都会非常受欢迎。

API 规范在这里: https://docs.microsoft.com/en-us/uwp/api/windows.storage.applicationdatacontainersettings?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(Windows.Storage.ApplicationDataContainerSettings);k(TargetFrameworkMoniker-.NETCore,Version%3Dv5.0);k(DevLang-csharp)%26rd%3Dtrue%26f%3D255%26MSPPError%3D-2147217396&view=winrt-19041

这里:

https://docs.microsoft.com/en-us/uwp/api/windows.foundation.collections.iobservablemap-2.mapchanged?view=winrt-19041

using System.Diagnostics;
using Windows.Foundation.Collections;
using Windows.Storage;
using Windows.UI.Xaml.Controls;

namespace AppDataTest
{
    public sealed partial class MainPage : Page
    {
        const string ContainerName = "Settings";
        const string Key1 = "One";
        const string Key2 = "Two";
        ApplicationDataContainerSettings Settings;
        public MainPage()
        {
            this.InitializeComponent();
            ApplicationDataContainer userSettings = ApplicationData.Current.LocalSettings.CreateContainer(ContainerName, ApplicationDataCreateDisposition.Always);
            Settings = (ApplicationDataContainerSettings)userSettings.Values;
            Settings.Clear();
            Settings.MapChanged += SettingsMapChanged;
            Settings.Add(Key1, "One");
            Settings.Clear();
            Settings[Key2] = "Two";
        }

        private void SettingsMapChanged(IObservableMap<string, object> sender, IMapChangedEventArgs<string> @event)
        {
            if (@event == null)
            {
                Debug.WriteLine("Null argument");
            }
            else
            {
                Debug.WriteLine($"{@event.CollectionChange} : {@event.Key}");
            }
            Debug.WriteLineIf(sender.Count == 0, "Empty Map");
            foreach (var item in sender)
            {
                Debug.WriteLine($"[{item.Key}] = {item.Value}");
            }
        }
    }
}

非常感谢

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    MapChanged事件的定义是:

    public event MapChangedEventHandler<string,object> MapChanged;
    

    它的事件参数是object类型(不是IMapChangedEventArgs&lt;string&gt;),根据测试,它总是返回null。

    此方法旨在在设置更改时进行通知,但不包括具体的修改数据。

    所以在这个事件中,你需要根据sender来判断集合的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2022-07-27
      • 1970-01-01
      相关资源
      最近更新 更多