Our application has user defined objects so we do not know the information layers or the geometry type until run time. We are using MVVM and I am struggling to find a way to bind several information layers and then to use the itemtemplateselector to decide wether the data should be displayed as mappolygon, mappolyline or mappoint.
I eventually gave up and tried to just get my polygons to show in a pre-existing information layer
However, nothing displays on the map. What am I am doing wrong???? I want to be able to bind any collection of mny viewmodels that implement the interfaces described below.
Here is a sample class that I implement it on
Here is the datatemplate that the itemtemplateselector finds (I checked it using a debug converter to check the value the binding passes and it is indeed passing a valid Location[] object)
this is what is in my view (the itemssource binding points to a List<PolygonObjectDataViewModel>)
I eventually gave up and tried to just get my polygons to show in a pre-existing information layer
However, nothing displays on the map. What am I am doing wrong???? I want to be able to bind any collection of mny viewmodels that implement the interfaces described below.
public
interface
IPolygon
{
Telerik.Windows.Controls.Map.Location[] Points {
get
;
set
; }
}
public
interface
IPolyline
{
Telerik.Windows.Controls.Map.Location[] Points {
get
;
set
; }
}
public
interface
IPoint
{
Telerik.Windows.Controls.Map.Location Point {
get
;
set
; }
}
Here is a sample class that I implement it on
public
class
PolygonObjectDataViewModel : ObjectDataViewModel, IPolygon
{
long
_geopid;
public
PolygonObjectDataViewModel(ObjectActivity oa,
bool
multi,
long
geoid)
:
base
(oa, multi)
{
_geopid = geoid;
}
public
Telerik.Windows.Controls.Map.Location[] Points
{
get
{
try
{
string
geometry = Activity.Data.First(x => x.Pid == _geopid).Value;
return
ConvertWKTPolygonToLocationArray(geometry);
}
catch
{
return
null
;
}
}
set
{
throw
new
NotImplementedException();
}
}
private
Telerik.Windows.Controls.Map.Location[] ConvertWKTPolygonToLocationArray(
string
geometry)
{
List<Telerik.Windows.Controls.Map.Location> temp =
new
List<Telerik.Windows.Controls.Map.Location>();
List<
string
> groups =
new
List<
string
>();
if
(geometry.ToLower().StartsWith(
"multi"
))
{
geometry = geometry.Replace(
"MULTIPOLYGON((("
,
""
);
geometry = geometry.Replace(
"MULTIPOLYGON ((("
,
""
);
geometry = geometry.Replace(
")))"
,
""
);
groups.AddRange(System.Text.RegularExpressions.Regex.Split(geometry,
"\\)\\)\\,\\(\\("
));
}
else
{
geometry = geometry.Replace(
"POLYGON(("
,
""
);
geometry = geometry.Replace(
"POLYGON (("
,
""
);
geometry = geometry.Replace(
"))"
,
""
);
groups.Add(geometry);
}
foreach
(
string
group
in
groups)
{
string
[] pairs = group.Split(
','
);
foreach
(
string
pair
in
pairs)
{
string
[] coords = pair.Trim().Split(
' '
);
Telerik.Windows.Controls.Map.Location l =
new
Telerik.Windows.Controls.Map.Location(
double
.Parse(coords[1]),
double
.Parse(coords[0]));
temp.Add(l);
}
}
return
temp.ToArray();
}
}
Here is the datatemplate that the itemtemplateselector finds (I checked it using a debug converter to check the value the binding passes and it is indeed passing a valid Location[] object)
<
DataTemplate
x:Key
=
"PolygonObjectDataViewModel"
>
<
telerik:MapPolygon
Points
=
"{Binding Points,Converter={StaticResource debug}}"
Stroke
=
"Yellow"
StrokeThickness
=
"2"
/>
</
DataTemplate
>
this is what is in my view (the itemssource binding points to a List<PolygonObjectDataViewModel>)
<
telerik:RadMap
UseSpringAnimations
=
"False"
Grid.Row
=
"2"
Provider
=
"{Binding Provider}"
MouseLeftButtonDown
=
"map_MouseLeftButtonDown"
ZoomLevel
=
"14"
VerticalAlignment
=
"Stretch"
HorizontalAlignment
=
"Stretch"
Center
=
"{Binding Center}"
Name
=
"map"
>
<
telerik:InformationLayer
Visibility
=
"Visible"
ItemTemplateSelector
=
"{Binding Source={StaticResource selector}}"
ItemsSource
=
"{Binding Path=Polygons}"
>
</
telerik:InformationLayer
>
</
telerik:RadMap
>