首页 > 解决方案 > 更改 ItemsSource 后,Bing 地图未更新 GUI

问题描述

我正在使用MVVMBing 地图

任务:在地图上绘制折线后(MapHandle.cs: List ViewFieldList),单击按钮(MapHandle.xaml: ButtonAddingField ),它通过FieldCollectionViewModel向模型添加新的折线。此外,Bing Maps 地图具有ItemsSource = "{Binding FieldList}"

问题:更新模型后地图没有添加折线。

模型 - Field.cs

public class Field {
    public LocationCollection LocList { get; set; }

    public Field(MapPolyline polyline)
    {
        LocList = polyline.Locations;
    }
}

ViewModel1 - FieldCollectionViewModel.cs

internal class FieldCollectionViewModel : BaseViewModel
{
    #region Public Properties

    public ObservableCollection<FieldViewModel> FieldList { get; set ; }

    #endregion Public Properties

    #region Constructor

    public FieldCollectionViewModel()
    {
        FieldList = new ObservableCollection<FieldViewModel>();
    }

    public FieldCollectionViewModel(List<Field> fields)
    {
        FieldList = new ObservableCollection<FieldViewModel>(fields.Select(f => new FieldViewModel(f)));
    }

    private DelegateCommand<object> addFieldCommand;

    public ICommand AddFieldCommand {
        get {
            if (addFieldCommand == null) addFieldCommand = new DelegateCommand<object>(AddNewField);
            return addFieldCommand;
        }
    }

    private void AddNewField(object parameter)
    {
        ((List<MapPolyline>)parameter).ForEach(i =>
       {
           var ff = new Field(i);
           FieldList.Add(new FieldViewModel(ff));
       });

        ((List<MapPolyline>)parameter).Clear();

    }

    #endregion Constructor

ViewModel2 - FieldViewModel.cs

internal class FieldViewModel : BaseViewModel
{
    #region Constructor

    public FieldViewModel(Field field)
    {
        Field = field;
    }

    #endregion

    #region Properties

    public Field Field;

    public LocationCollection LocList
    {
        get => Field.LocList;
        set
        {
            Field.LocList = value;
            OnPropertyChanged(nameof(LocList));
        }
    }

    #endregion
}

BaseVewModel:PropertyChanged 功能

查看 - MapHandle.xaml

   <m:Map
        x:Name="myMap"
        Mode="AerialWithLabels"
        MouseMove="myMap_MouseMove"
        MouseUp="myMap_MouseUp">
        <m:MapItemsControl x:Name="MapItems" ItemsSource="{Binding FieldList}">
            <m:MapItemsControl.ItemTemplate>
                <DataTemplate>
                    <m:MapPolyline
                        Fill="Aqua"
                        Locations="{Binding LocList}"
                        Stroke="ForestGreen"
                        StrokeDashArray="2 2"
                        StrokeThickness="5" />
                </DataTemplate>
            </m:MapItemsControl.ItemTemplate>
        </m:MapItemsControl>

    </m:Map>
    <Button
        x:Name="ButtonAddingField"
        Height="75"
        HorizontalContentAlignment="Left"
        Command="{Binding AddFieldCommand}"
        CommandParameter="{Binding Path=ViewFieldList, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}" />

查看 - MapHandle.cs

public partial class MapHandle
{
    public List<MapPolyline> ViewFieldList { get; set; } = new List<MapPolyline>();


    public MapHandle()
    {
        InitializeComponent();

        this.DataContext = new FieldCollectionViewModel();
        ...
    }
}

但!如果我向 Map(在 UI 中)添加一些东西,例如,通过鼠标左键(myMap.Children.Add())进行 Pushpin,那么 Map 将从模型中提取所有内容。我该如何解决?

为什么会这样?

标签: c#wpfmvvmbing-mapsbing

解决方案


推荐阅读