首页 > 解决方案 > IMapChangedEventArgs始终为空,面向 Windows 10,版本 2004

问题描述

谁能告诉我为什么 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

解决方案


MapChanged 事件的定义是:

public event MapChangedEventHandler<string,object> MapChanged;

它的事件参数是objecttype(不是IMapChangedEventArgs<string>),根据测试,它总是返回null。

此方法旨在通知设置何时更改,但不包括特定的修改数据。

所以在这种情况下,需要根据sender.


推荐阅读