UWP C# 将 JSON 项绑定到 Button MenuFlyout

UWP C# Bind JSON items to Button MenuFlyout

我有一个将通过网络添加的客户端设备的动态列表。连接后,他们的详细信息将保存在 JSON 文件中。 我想对客户端设备进行额外的显示和控制,我点击 Add 按钮,其中 MenuFlyout 填充了客户端设备的列表 ClientName 来自 JSON 文件。选择 menuitem 后,它将为在网格上选择的相应客户端设备添加一个按钮和连接状态指示器(例如,已连接、已断开连接或错误)。

请帮忙。 谢谢。

my json class 是在单独的 .cs 中创建的 我不确定我是否在 MenuFlyoutItem_Click 处正确地执行了操作,其中 item.clientname 有错误。

json 文件clientslist.txt 我已经检查过格式似乎是正确的。

您可以参考下面的代码。我还没有找到使用 Bindingx:Bind 的方法,但我们可以在 [=29= 之后手动将 MenuFlyoutItem 添加到 MenuFlyout ] 数据反序列化。

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var deviceList = JsonConvert.DeserializeObject<List<DeviceInfo>>(jsonData);
        var menuFlyout = new MenuFlyout();
        foreach (var device in deviceList)
        {
            var menuFlyoutItem = new MenuFlyoutItem() { Name = device.DeviceName, Text = device.DeviceName };
            menuFlyoutItem.Tag = device.DeviceName;
            menuFlyoutItem.Click += MenuFlyoutItem_Click;
            menuFlyout.Items.Add(menuFlyoutItem);
        }

        ButtonCreateDevice.Flyout = menuFlyout;
    }

    private void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)
    {
        var item = sender as MenuFlyoutItem;
        var deviceName = item.DeviceName;

        //TO DO SOMETHING
    }

DeviceInfo class 定义为:

    class DeviceInfo
    {
        public string DeviceName { get; set; }
        public string Status { get; set; };
    }

测试样本数据(json数据)为:

[{"DeviceName":"LED-1","Status":"Connected"},{"DeviceName":"LED-2","Status":"Connected"},{"DeviceName":"LED-3","Status":"Connected"}]

我设法使用 serialization.json 做到了

 private async void AddButton_Click(object sender, RoutedEventArgs e)
    {
        List<ClientList> clientLists;
        var jsonSerializer = new DataContractJsonSerializer(typeof(List<ClientList>));
        try
        {
            var myStream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(CLIENTSLIST);

            clientLists = (List<ClientList>)jsonSerializer.ReadObject(myStream);
            var menuFlyout = new MenuFlyout();

            foreach (var device in clientLists)
            {
                var menuFlyoutItem = new MenuFlyoutItem() { Name = device.clientname, Text = device.clientname };
                menuFlyoutItem.Tag = device.clientname;
                menuFlyoutItem.Click += MenuFlyoutItem_Click;
                menuFlyout.Items.Add(menuFlyoutItem);
            }
            AddButton.Flyout = menuFlyout;
        }
        catch (Exception)
        {
            //Do nothing, file doesn't exist
        }
    }

    private void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)
    {
        var item = sender as MenuFlyoutItem;
        var deviceName = item.Tag;

        //TO DO SOMETHING
    }
}