绑定时未实现错误的方法或操作

时间:2012-10-22 07:56:19

标签: wpf visual-studio-2010 data-binding vspackage graph-sharp

我目前正在开发一个Visual Studio插件(VSPackage),它最终应该能够可视化调用关系。为了表示它们,我想使用管理图形的Graph# library(避免重叠边缘等)。 不幸的是,我在运行时在我的XAML中收到以下错误消息:

XamlParseException:未实现方法或操作。

<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>

我还创建了自己的顶点,边和图布局类。我的图最终应该表示方法(顶点)之间的调用关系(边)。

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)
    {}
}

ExplorationToolViewModel 中,我按如下方式声明了RelationGraph:

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));
}

我可能还应该提到的是,我有时会显示以下错误,但项目编译并运行。

GenericArguments [1],'Biocoder.InteractiveExploration.Graph.RelationEdge','GraphSharp.Algorithms.Layout.ILayoutAlgorithm`3 [TVertex,TEdge,TGraph]'违反了'TEdge'类型的约束。< / em>的

也许它是问题的根源但我忽略了它,因为它编译了,我做了对应这个tutorial

奇怪的是它实际上在使用Graph#提供的DLL的普通WPF应用程序中工作。当我离开Graph-property时,错误没有出现,所以我猜它与Graph属性有关。关于如何解决这个问题的任何提示?

非常感谢你!

2 个答案:

答案 0 :(得分:1)

在VSPackage中使用Graph#时遇到了同样的问题。我能够通过不对图表使用Bindings来克服这个问题,但是通过在CodeBehind中分配Graph属性。

这导致了一个例外,即在分配Graph属性时无法加载WPFExtensions程序集。我怀疑原因是在GraphSharp.Controls中,程序集在XAML中使用,但在编译时不会添加引用,因为代码中没有引用。我可以通过在分配Graph属性之前添加以下行来解决此问题:

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

此行在WPF尝试根据XAML中的引用加载WPFExtensions库之前加载WPFExtensions库。之后,显示了图表。

答案 1 :(得分:1)

在我的情况下,程序集未被复制到输出文件夹,因为copy local设置为false。将copy local设置为true解决了它。 (程序集A依赖于程序集B,它没有复制本地标志。)