0

我尝试在 ContentPage 上显示Activity类型的ObservableCollection(我创建的类)。这个包含一个标题(字符串)和一个地图(xamarin.forms.maps)

Map myMap = new Map();
myMap.IsShowingUser = true;
activity.Map = myMap;
obActivities.Add(activity);

这是我的 XAML:

<ListView x:Name="listActivities" HorizontalOptions="StartAndExpand" VerticalOptions="FillAndExpand"
        SeparatorColor="LightGray" SeparatorVisibility="Default" HasUnevenRows="True"
        ItemsSource="{Binding obActivities}" CachingStrategy="RecycleElement"
        ItemSelected="ListActivities_ItemSelected" SelectedItem="{Binding selectedActivity,Mode=TwoWay}" >
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal" Padding="5" VerticalOptions="FillAndExpand">

                            <ContentView Content="{Binding Map}"></ContentView>
                            <Label Text="{Binding Title}" FontSize="12" TextColor="Gray"/>
                            
                            
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

标题显示得很好

我尝试了很多东西(可能是我能做的一切^^)来显示地图,但没有任何效果。我在这篇文章之前尝试的最后一件事......<ContentView Content="{Binding Map}"></ContentView>但没有结果。

编辑: 我还尝试将我的地图控件添加到 XAML 中,例如:

<map:Map>
   <map:Map.MapElements>
     <map:Polyline>
        <map:Polyline.Geopath>
                                                
        </map:Polyline.Geopath>
     </map:Polyline>
   </map:Map.MapElements>
</map:Map>

但我不知道我必须在哪里从我的虚拟机添加折线的位置。也许你能帮我找到合适的 XAML ...

4

1 回答 1

0
  1. 我建议从视图或页面内部管理一组 UI 元素(此处为地图)。我会将所有 ViewModel 代码移动到页面的代码隐藏.xaml.cs文件中。每个项目(“Activity”)仍然有一个“模型”,但不再是对应于 Page 本身的 ViewModel。

注意:这是一种“不纯”的方法,因为 Activity 是模型和 UI 信息的混合体。尽管如此,这样做的代码更简单。所以我不会试图展示一个“纯”的解决方案。在一个简单的情况下,这样做的复杂性超过了保持视图和模型分离的“维护”好处[更容易进行更改而不会导致错误]。如果这会导致以后出现问题,请在那时重构。

然后 BindingContext 成为页面本身:

public MyPage() {
    InitializeComponent();
    InitMyData();
    BindingContext = this;
}

public ObservableCollection<Activity> obActivities { get; set; } = new ObservableCollection<Activity>();

void InitMyData() {
    Map myMap = new Map();
    myMap.IsShowingUser = true;
    activity.Map = myMap;
    obActivities.Add(activity);
}

  1. 地图在创建时可能缺少高度。StackLayout默认情况下可能已经给它“0”高度。指定一些高度:

     Map myMap = new Map();
     myApp.HeightRequest = 100;
    

具有“硬编码”高度(例如100)也有助于加快页面的初始布局。

于 2021-11-30T03:26:11.423 回答