Я работаю над проектом поверхности, где у нас есть элемент управления bing maps и где мы хотели бы рисовать полилинии на карте с помощью привязки данных.
Странное поведение заключается в том, что когда я нажимаю кнопку «Добавить», на карте ничего не происходит. Если я немного сдвину карту, на карте будет нарисована полилиния. Другой сценарий, который работает, - это один раз нажать кнопку добавления, ничего не происходит, щелкнуть ее еще раз, обе полилинии нарисованы. (В моей ручной коллекции у меня есть 4 LocationCollections), поэтому то же самое происходит для третьего щелчка и четвертого щелчка, когда снова рисуются обе линии.
Я совершенно не знаю, где искать, чтобы исправить это. Я пытался подписаться на события Layoutupdated, которые происходят в обоих случаях.Также добавлено событие collectionchanged в наблюдаемую коллекцию, чтобы увидеть, срабатывает ли добавление, и да, оно срабатывает. Еще одна вещь, которую я пробовал, - это изменить полилинию на канцелярскую кнопку и взять первое местоположение из набора местоположений в модели представления конвейера, чем ожидалось.
Я загрузил образец проекта, если вы хотите сами увидеть, что происходит.
Очень надеюсь, что кто-нибудь укажет мне правильное направление, потому что я больше ничего не понимаю.
Ниже вы найдете код, который я написал:
У меня есть следующие модели представления:
MainViewModel
public class MainViewModel
{
private ObservableCollection _pipelines;
public ObservableCollection Pipes
{
get { return _pipelines; }
}
public MainViewModel()
{
_pipelines = new ObservableCollection();
}
}
И PipelineViewModel, в которой есть коллекция Locations, которая реализует INotifyPropertyChanged:
PipelineViewModel
public class PipelineViewModel : ViewModelBase
{
private LocationCollection _locations;
public string Geometry { get; set; }
public string Label { get; set; }
public LocationCollection Locations
{
get { return _locations; }
set
{
_locations = value;
RaisePropertyChanged("Locations");
}
}
}
My XAML выглядит следующим образом:
И в нашем отделенном коде мы настраиваем привязку и событие щелчка следующим образом:
private int _counter = 0;
private string[] geoLines;
private MainViewModel _mainViewModel = new MainViewModel();
///
/// Default constructor.
///
public SurfaceWindow1()
{
InitializeComponent();
// Add handlers for window availability events
AddWindowAvailabilityHandlers();
this.DataContext = _mainViewModel;
geoLines = new string[4]{ "52.588032,5.979309; 52.491143,6.020508; 52.397391,5.929871; 52.269838,5.957336; 52.224435,5.696411; 52.071065,5.740356",
"52.539614,4.902649; 52.429222,4.801025; 52.308479,4.86145; 52.246301,4.669189; 52.217704,4.836731; 52.313516,5.048218",
"51.840869,4.394531; 51.8731,4.866943; 51.99841,5.122375; 52.178985,5.438232; 51.8731,5.701904; 52.071065,6.421509",
"51.633362,4.111633; 51.923943,6.193542; 52.561325,5.28717; 52.561325,6.25946; 51.524125,5.427246; 51.937492,5.28717" };
}
private void add_Click(object sender, RoutedEventArgs e)
{
PipelineViewModel plv = new PipelineViewModel();
plv.Locations = AddLinestring(geoLines[_counter]);
plv.Geometry = geoLines[_counter];
_mainViewModel.Pipes.Add(plv);
_counter++;
}
private LocationCollection AddLinestring(string shapegeo)
{
LocationCollection shapeCollection = new LocationCollection();
string[] lines = Regex.Split(shapegeo, ";");
foreach (string line in lines)
{
string[] pts = Regex.Split(line, ",");
double lon = double.Parse(pts[1], new CultureInfo("en-GB"));
double lat = double.Parse(pts[0], new CultureInfo("en-GB"));
shapeCollection.Add(new Location(lat, lon));
}
return shapeCollection;
}