不能在网格中使用 ObservableCollection 吗?
Can't use ObservableCollection in a Grid?
我目前正在使用 Xamarin 应用程序读取 RFID 温度标签并实时更新它们的值。当前设置使用两个 Horizontal StackLayouts,一个带有显示标签及其值列表的 ListView,另一个带有人体图像网格,我希望在上面(在特定位置)显示值。
在ListView端,我可以成功调用一个叫TagInfoList的对象,它是我从BasePage初始化调用的Class中的一个ObservableCollection。但是,在 Grid 端,我尝试了多种使用 TagInfoList 的方法,但它不起作用。我尝试了 BindableLayouts、DataTemplates + ViewCells,并且 none 允许我在第二个 StackLayout 中使用 TagInfoList。
这是两个水平 StackLayout 的 XAML 代码:
<StackLayout Orientation="Horizontal" HorizontalOptions="StartAndExpand">
<ListView x:Name="liewViewTagData" ItemsSource="{Binding TagInfoList}" SelectedItem="{Binding objItemSelected, Mode=TwoWay}">
<ListView.Header>
<StackLayout BackgroundColor="#cccccc">
<Grid>
<!-- Grid + Label code irrelevant to my issue-->
</Grid>
</StackLayout>
</ListView.Header>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Vertical">
<Grid>
<!-- Grid + Label code irrelevant to my issue-->
</Grid>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout> <!-- RFID Tag Section -->
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand"> <!-- Body Model Section -->
<!-- HERE: WHAT TO PUT FOR TagInfoList TO BE USABLE? -->
<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" WidthRequest="400" ColumnSpacing="0">
<!-- Grid + Label + Images I want to use TagInfoList information in -->
</Grid>
<!-- HERE: WHAT TO PUT FOR TagInfoList TO BE USABLE? -->
</StackLayout> <!-- Body Model Section -->
</StackLayout>```
我删除了网格内部的大部分内容,因为它不相关。 TagInfoList 是一个 class 的 ObservableCollection,它包含我需要的所有数据(字符串和整数)。如何在第二个 StackLayout 中使用 TagInfoList?如果我使用与第一个 StackLayout 相同的方法,我会收到一个错误,提示我调用了 TagInfoList 两次(通过 'liewViewTagData' 项)。这是 .xaml.cs 文件中的代码:
liewViewTagData.ItemSelected += (sender, e) => {
if (e.SelectedItem == null) return; // Don't do anything if we just de-selected the row
((ListView)sender).SelectedItem = null; // De-select the row
};
我的唯一目标是在两个 StackLayout 中使用 TagInfoList ObservableCollection,但我不确定该怎么做。
谢谢!
If I do it the same method as the first StackLayout, I get an error
that I've called TagInfoList twice (through the 'liewViewTagData'
item).
您可以按照第一个StackLayout
的方式进行。您可以将两个列表视图的属性 x:Name
更改为不同的Name
。
您可以参考以下代码:
<ScrollView Orientation="Horizontal">
<StackLayout Orientation="Horizontal" HorizontalOptions="StartAndExpand">
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
<ListView x:Name="liewViewTagData" RowHeight="60" ItemsSource="{ Binding TagInfoList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<!--other code-->
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
<ListView x:Name="liewView2" RowHeight="60" ItemsSource="{ Binding TagInfoList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<!--other code-->
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ScrollView>
注:
如果你运行出水平space,建议你在外层加一个ScrollView
我目前正在使用 Xamarin 应用程序读取 RFID 温度标签并实时更新它们的值。当前设置使用两个 Horizontal StackLayouts,一个带有显示标签及其值列表的 ListView,另一个带有人体图像网格,我希望在上面(在特定位置)显示值。
在ListView端,我可以成功调用一个叫TagInfoList的对象,它是我从BasePage初始化调用的Class中的一个ObservableCollection。但是,在 Grid 端,我尝试了多种使用 TagInfoList 的方法,但它不起作用。我尝试了 BindableLayouts、DataTemplates + ViewCells,并且 none 允许我在第二个 StackLayout 中使用 TagInfoList。
这是两个水平 StackLayout 的 XAML 代码:
<StackLayout Orientation="Horizontal" HorizontalOptions="StartAndExpand">
<ListView x:Name="liewViewTagData" ItemsSource="{Binding TagInfoList}" SelectedItem="{Binding objItemSelected, Mode=TwoWay}">
<ListView.Header>
<StackLayout BackgroundColor="#cccccc">
<Grid>
<!-- Grid + Label code irrelevant to my issue-->
</Grid>
</StackLayout>
</ListView.Header>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Vertical">
<Grid>
<!-- Grid + Label code irrelevant to my issue-->
</Grid>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout> <!-- RFID Tag Section -->
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand"> <!-- Body Model Section -->
<!-- HERE: WHAT TO PUT FOR TagInfoList TO BE USABLE? -->
<Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" WidthRequest="400" ColumnSpacing="0">
<!-- Grid + Label + Images I want to use TagInfoList information in -->
</Grid>
<!-- HERE: WHAT TO PUT FOR TagInfoList TO BE USABLE? -->
</StackLayout> <!-- Body Model Section -->
</StackLayout>```
我删除了网格内部的大部分内容,因为它不相关。 TagInfoList 是一个 class 的 ObservableCollection,它包含我需要的所有数据(字符串和整数)。如何在第二个 StackLayout 中使用 TagInfoList?如果我使用与第一个 StackLayout 相同的方法,我会收到一个错误,提示我调用了 TagInfoList 两次(通过 'liewViewTagData' 项)。这是 .xaml.cs 文件中的代码:
liewViewTagData.ItemSelected += (sender, e) => {
if (e.SelectedItem == null) return; // Don't do anything if we just de-selected the row
((ListView)sender).SelectedItem = null; // De-select the row
};
我的唯一目标是在两个 StackLayout 中使用 TagInfoList ObservableCollection,但我不确定该怎么做。
谢谢!
If I do it the same method as the first StackLayout, I get an error that I've called TagInfoList twice (through the 'liewViewTagData' item).
您可以按照第一个StackLayout
的方式进行。您可以将两个列表视图的属性 x:Name
更改为不同的Name
。
您可以参考以下代码:
<ScrollView Orientation="Horizontal">
<StackLayout Orientation="Horizontal" HorizontalOptions="StartAndExpand">
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
<ListView x:Name="liewViewTagData" RowHeight="60" ItemsSource="{ Binding TagInfoList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<!--other code-->
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
<StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
<ListView x:Name="liewView2" RowHeight="60" ItemsSource="{ Binding TagInfoList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<!--other code-->
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ScrollView>
注:
如果你运行出水平space,建议你在外层加一个ScrollView