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
我已经检查过格式似乎是正确的。
您可以参考下面的代码。我还没有找到使用 Binding 或 x: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
}
}
我有一个将通过网络添加的客户端设备的动态列表。连接后,他们的详细信息将保存在 JSON 文件中。
我想对客户端设备进行额外的显示和控制,我点击 Add
按钮,其中 MenuFlyout
填充了客户端设备的列表 ClientName
来自 JSON 文件。选择 menuitem
后,它将为在网格上选择的相应客户端设备添加一个按钮和连接状态指示器(例如,已连接、已断开连接或错误)。
请帮忙。 谢谢。
my json class 是在单独的 .cs 中创建的 MenuFlyoutItem_Click
处正确地执行了操作,其中 item.clientname
有错误。
json
文件clientslist.txt
我已经检查过格式似乎是正确的。
您可以参考下面的代码。我还没有找到使用 Binding 或 x: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
}
}