2012-10-22 19 views
7

Attualmente sto sviluppando un plug-in di Visual Studio (VSPackage) che alla fine dovrebbe essere in grado di visualizzare le relazioni di chiamata. Per rappresentarli voglio usare lo Graph# library che gestisce il grafico (evitando i bordi sovrapposti, ecc.). Sfortunatamente sul mio XAML compare il seguente messaggio di errore:Metodo o operazione non implementata errore su Binding

XamlParseException: il metodo o l'operazione non sono implementati.

L'errore si apre sul tag <graph:CallRelationGraphLayout Graph="{Binding RelationGraph}"/>.

<UserControl x:Class="Biocoder.InteractiveExploration.View.ExplorationControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:graphsharp="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls" 
     xmlns:zoom="clr-namespace:WPFExtensions.Controls;assembly=WPFExtensions" 
     xmlns:graph="clr-namespace:Biocoder.InteractiveExploration.Graph" 
     xmlns:viewmodels="clr-namespace:Biocoder.InteractiveExploration.ViewModel" 
     xmlns:controls="clr-namespace:Biocoder.InteractiveExploration.Controls" mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 



<UserControl.DataContext> 
    <viewmodels:ExplorationToolViewModel/> 
</UserControl.DataContext> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <zoom:ZoomControl Grid.Row="1" 
         Zoom="0.2" 
         ZoomBoxOpacity="0.5" 
         Background="Yellow"> 

     <graph:CallRelationGraphLayout Graph="{Binding RelationGraph}"/> 

    </zoom:ZoomControl> 

</Grid> 

</UserControl> 

Ho anche creato le proprie classi di layout per vertici, bordi e grafici. Il mio grafico dovrebbe infine rappresentare le relazioni di chiamata (bordi) tra i metodi (vertici).

MethodVertex.cs

public class MethodVertex 
{ 
    public string ID { get; private set; } 
    public bool IsMale { get; private set; } 

    public MethodVertex(string id, bool isMale) 
    { 
     ID = id; 
     IsMale = isMale; 
    } 

    public override string ToString() 
    { 
     return string.Format("{0}-{1}", ID, IsMale); 
    } 
} 

RelationEdge.cs

public class RelationEdge : Edge<MethodVertex> 
{ 
    public string Id { get; private set; } 

    public RelationEdge(string id, MethodVertex source, MethodVertex target) 
     : base(source, target) 
    { 
     Id = id; 
    } 
} 

CallRelationGraphLayout.cs

public class CallRelationGraphLayout : GraphLayout<MethodVertex, RelationEdge, CallRelationGraph> 
{} 

CallRelationGraph.cs

public class CallRelationGraph : BidirectionalGraph<MethodVertex, RelationEdge> 
{ 
    public CallRelationGraph() 
    {} 

    public CallRelationGraph(bool allowParallelEdges) 
     : base(allowParallelEdges) 
    { } 

    public CallRelationGraph(bool allowParallelEdges, int vertexCapacity) 
     : base(allowParallelEdges, vertexCapacity) 
    {} 
} 

Nel ExplorationToolViewModel ho dichiarato il RelationGraph come segue:

private CallRelationGraph _relationGraph; 
public CallRelationGraph RelationGraph 
{ 
    get { return _relationGraph; } 
    set 
    { 
     if (value != _relationGraph) 
     { 
      _relationGraph = value; 
      NotifyPropertyChanged("RelationGraph"); 
     } 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

public void NotifyPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

Quello che forse anche dovrei menzionare è che ho il seguente errore visualizzato a volte, ma il progetto compila e corre.

GenericArguments [1], 'Biocoder.InteractiveExploration.Graph.RelationEdge', sulla 'GraphSharp.Algorithms.Layout.ILayoutAlgorithm`3 [TVertex, TEdge, TGraph]' viola il vincolo di tipo 'TEdge'.

Forse è la fonte del problema ma l'ho ignorato fino a quel momento da quando è stato compilato e l'ho fatto corrispondente a questo tutorial.

La cosa strana è che in realtà funziona in una normale applicazione WPF utilizzando le DLL fornite da Graph #. Quando esco dalla proprietà Graph, l'errore non viene visualizzato, quindi suppongo che abbia a che fare con la proprietà Graph. Qualche suggerimento su come risolvere questo?

Grazie mille in anticipo!

+0

Si prega inoltre di pubblicare la dichiarazione della proprietà 'RelationGraph' in' ExplorationToolViewModel'. – Clemens

+0

@Clemens Grazie! Ho appena aggiunto anche la dichiarazione richiesta. Tutto dovrebbe andare bene secondo me: S – Biocoder

+0

E anche pubblicare la dichiarazione della classe 'CallRelationGraphLayout' – Palesz

risposta

1

Ho riscontrato lo stesso problema quando si utilizza Graph # in un VSPackage. Sono stato in grado di superare il problema non utilizzando Binding per il grafico, ma assegnando la proprietà Graph in CodeBehind.

Ciò ha comportato un'eccezione che non è stato possibile caricare l'assembly WPFExtensions durante l'assegnazione della proprietà Graph. Sospetto che la ragione di ciò sia in GraphSharp.Controlli, l'assembly viene utilizzato in XAML, ma il riferimento non viene aggiunto durante la compilazione in quanto non ci sono riferimenti nel codice. Sono stato in grado di risolvere questo problema aggiungendo la seguente riga prima di assegnare la proprietà Graph:

var a = System.Reflection.Assembly.Load("WPFExtensions, Version=1.0.3437.34043, Culture=neutral, PublicKeyToken=null"); 

Questa linea carica la libreria WPFExtensions prima di WPF cerca di caricarlo sulla base del riferimento nel XAML. Successivamente, è stato mostrato il grafico.

+0

Questo ha funzionato per me! Semplicemente aggiungendo 'System.Reflection.Assembly.Load (" RequiredLibrary, Version = {VersionNumber}, Culture = neutral, PublicKeyToken = null ");' nel costruttore di una pagina XAML prima della riga 'InitializeComponent();' trucco. Grazie! – klugerama

0

Nel mio caso un assembly non è stato copiato nella cartella di output perché copy local è stato impostato su false. L'impostazione della copia locale su true lo ha risolto. (Un assembly A era dipendente dall'assembly B che non aveva il flag locale di copia.)

Problemi correlati