绑定到 class 中的列表
Binding to a list in a class
对于我正在使用蓝牙设备开发的应用程序。
这些设备中的每一个都有一个名称和几个服务。我正在尝试以编程方式向他们展示他们的服务。
为此,我创建了一个包含服务列表的 class。但是,当尝试绑定时,服务列表似乎完全是空的。
XAML:
public class BluetoothDevices
{
public string Name{ get; set;}
//public List<Guid> Services { get; set; }
public List<string> Services { get; set; }
}
XAML:
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" Width="150" />
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Services}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
c#:
adapter.ScanForBroadcasts(async (IBlePeripheral peripheral) =>
{
//List<Guid> services = new List<Guid>();
List<string> services = new List<string>();
string devicename = peripheral.Advertisement.DeviceName;
var _services = peripheral.Advertisement.Services;
var servicedata = peripheral.Advertisement.ServiceData;
//services = (_services.ToList());
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
services.Add("i am a string ");
BluetoothDevices.Add(new BluetoothDevices { Name = devicename, Services = services });
});
//BluetoothDevices = new ObservableCollection<BluetoothDevices>(BluetoothDevices.Distinct());
}, TimeSpan.FromSeconds(30));
像这样更改绑定。我假设您希望此内部 ListView
显示所有可用服务。为此,您必须将 Services
列表绑定到 ListView
的 ItemsSource
,以便列表中的每个项目都是 ListView
中的一个元素。通过使用 Text="{Binding}"
,文本块直接绑定到集合的每个实例(在本例中 string
直接绑定到 Text
)。所以像这样修改你的绑定:
<ListView ItemsSource="{Binding Services}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
希望对您有所帮助!
编辑: 添加了绑定说明
对于我正在使用蓝牙设备开发的应用程序。 这些设备中的每一个都有一个名称和几个服务。我正在尝试以编程方式向他们展示他们的服务。
为此,我创建了一个包含服务列表的 class。但是,当尝试绑定时,服务列表似乎完全是空的。
XAML:
public class BluetoothDevices
{
public string Name{ get; set;}
//public List<Guid> Services { get; set; }
public List<string> Services { get; set; }
}
XAML:
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name}" Width="150" />
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Services}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
c#:
adapter.ScanForBroadcasts(async (IBlePeripheral peripheral) =>
{
//List<Guid> services = new List<Guid>();
List<string> services = new List<string>();
string devicename = peripheral.Advertisement.DeviceName;
var _services = peripheral.Advertisement.Services;
var servicedata = peripheral.Advertisement.ServiceData;
//services = (_services.ToList());
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
services.Add("i am a string ");
BluetoothDevices.Add(new BluetoothDevices { Name = devicename, Services = services });
});
//BluetoothDevices = new ObservableCollection<BluetoothDevices>(BluetoothDevices.Distinct());
}, TimeSpan.FromSeconds(30));
像这样更改绑定。我假设您希望此内部 ListView
显示所有可用服务。为此,您必须将 Services
列表绑定到 ListView
的 ItemsSource
,以便列表中的每个项目都是 ListView
中的一个元素。通过使用 Text="{Binding}"
,文本块直接绑定到集合的每个实例(在本例中 string
直接绑定到 Text
)。所以像这样修改你的绑定:
<ListView ItemsSource="{Binding Services}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
希望对您有所帮助!
编辑: 添加了绑定说明