获取所选节点的基本内容

时间:2016-11-12 04:50:45

标签: c# wpf syncfusion

我正在使用 Syncfusion WPF控件。我创建了一个显示径向树图的项目。

我正在尝试访问图片底部内容(Link,LinkID,ParentID等)下列出的基本值。

图片:

enter image description here

查看NodeSelected事件,当我运行node.Content.GetType().ToString()时,我得到了包含我想要访问的属性的基类模型。

所以我不确定如何从选择节点到获取作为节点数据的基类的属性。

希望一切都有道理,我自学成才。

这是我的MainWindow代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using Syncfusion;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Syncfusion.UI.Xaml.Diagram.Layout;
using Syncfusion.UI.Xaml.Diagram;
using System.Collections.ObjectModel;
using Link_Map.Classes;
using Syncfusion.SfSkinManager;
using Syncfusion.Windows.Shared;
using Syncfusion.Windows.Tools.Controls;
using Syncfusion.UI.Xaml.Diagram.Controls;

namespace Link_Map
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : RibbonWindow
    {
        Controller controller = new Controller();
        DirectedTreeLayout tree = new DirectedTreeLayout();
        ObservableCollection<Node> nodes = new ObservableCollection<Node>();
        ObservableCollection<Connector> connects = new ObservableCollection<Connector>();
        public MainWindow()
        {
            InitializeComponent();
            InitDiagram();
            controller.AddRoot();
            Link_Grid.ItemsSource = controller.viewmodel.Links;
            SkinStorage.SetVisualStyle(this, "Blend");
            //nodes.ElementAt(0).IsSelected = true;
        }

        private void InitDiagram()
        {
            controller.Init();
            lmWindow.Nodes = nodes;
            lmWindow.Connectors = connects;
            DataSourceSettings settings = new DataSourceSettings();
            settings.DataSource = controller.viewmodel.Links;
            settings.ParentId = "ParentID";
            settings.Id = "LinkID";
            settings.Root = "0";
            lmWindow.DataSourceSettings = settings;
            settings.DataSource = controller.viewmodel.Links;
            (lmWindow.Info as IGraphInfo).ItemAdded += MainWindow_ItemAdded;
            (lmWindow.Info as IGraphInfo).ItemSelectedEvent += NodeSelected;

            lmWindow.LayoutManager = new LayoutManager()
            {
                Layout = new RadialTreeLayout()
            };



            (lmWindow.LayoutManager.Layout as RadialTreeLayout).HorizontalSpacing = 10;
            (lmWindow.LayoutManager.Layout as RadialTreeLayout).VerticalSpacing = 35;



            //lmWindow.Tool = Tool.SingleSelect;
            //lmWindow.Tool = Tool.ZoomPan;
            lmWindow.Menu = null;
            lmWindow.ScrollSettings.ScrollLimit = ScrollLimit.Diagram;
            lmWindow.DefaultConnectorType = ConnectorType.Line;
            lmWindow.PageSettings.PageBorderBrush = new SolidColorBrush(Colors.Transparent);


            SelectorViewModel svm = (lmWindow.SelectedItems as SelectorViewModel);
            svm.SelectorConstraints = svm.SelectorConstraints & ~(SelectorConstraints.QuickCommands|SelectorConstraints.Resizer);




            //lmWindow.Constraints = SelectorConstraints.QuickCommands;

            //lmWindow.Constraints = lmWindow.Constraints & ~(GraphConstraints.Draggable | GraphConstraints.Selectable);


    }

        public void NodeSelected(object sender, DiagramEventArgs e)
        {
            Node node = (e.Item as Node);
            string ders = node.Content.GetType().ToString();
            Console.WriteLine(ders);
        }

        private void Metro_Theme_Click(object sender, RoutedEventArgs e)
        {
            SkinStorage.SetVisualStyle(this, "Metro");
        }

        private void Blend_Theme_Click(object sender, RoutedEventArgs e)
        {
            SkinStorage.SetVisualStyle(this, "Blend");
        }

        private void Add_Click(object sender, RoutedEventArgs e)
        {
            for(int i=0; i<10; i++)
            {
                controller.AddLink();
            }
            lmWindow.LayoutManager.Layout.UpdateLayout();
        }

        //https://www.syncfusion.com/forums/127392/how-to-fire-event-on-sfdiagram-node-selection
        //Apply Node and Connector Style
        private void MainWindow_ItemAdded(object sender, ItemAddedEventArgs args)
        {
            if (args.Item is INode)
            {
                (args.Item as INode).UnitWidth = 10;
                (args.Item as INode).UnitHeight = 10;
                (args.Item as INode).ContentTemplate = this.lmWindow.Resources["contentTemplate"] as DataTemplate;
            }
            else if (args.Item is IConnector)
            {
                SolidColorBrush solid = new SolidColorBrush();
                solid.Color = Color.FromArgb(255, 186, 186, 186);
                (args.Item as IConnector).TargetDecoratorStyle = this.Resources["style"] as Style;
            }
        }

        private void Link_Grid_GridPasteContent(object sender, Syncfusion.UI.Xaml.Grid.GridCopyPasteEventArgs e)
        {

        }
    }
}

2 个答案:

答案 0 :(得分:0)

好吧,我解决了我的问题,但我不知道为什么会这样。

我是自学成才,所以我只想尝试一切,直到它有效。我能够获得我想要的基类内容:

public void NodeSelected(object sender, DiagramEventArgs e)
{
    Node node = (e.Item as Node);
    string ders = ((Link_Map.Classes.Links)(((System.Windows.Controls.ContentControl)(node)).Content)).link;
    Console.WriteLine(ders);
}

尽管(node)).Content)).link是我想要的属性,但我现在可以从这里访问任何基类属性。

如果有人有更好的方法,请发帖!

答案 1 :(得分:0)

要求:“需要获取所选节点的内容属性”。

方式1:施法: 要执行强制转换,请在要转换的值或变量前面的括号中指定要转换的类型。我们提供了一个代码示例来表示这一点。请参考下面的代码示例。

方式2:通过foreach_Reflection迭代属性: GetProperties方法(FrameWork)用于获取类模型Properties,因为我们已经找到了属性值。请参考下面的代码示例。

代码示例:

//ItemSelectedEvent
(diagram.Info as IGraphInfo).ItemSelectedEvent += MainWindow_ItemSelectedEvent;

void MainWindow_ItemSelectedEvent(object sender, DiagramEventArgs args)
{
    INode node = args.Item as INode;
    //Way 1:casting
    string des = (node.Content as Employee).EmpId.ToString();
    Console.WriteLine(des);

    //Way 2: Iterate the Propeties via foreach
    foreach(var prop in node.Content.GetType().GetProperties())
    {
        string des= prop.GetValue(node.Content).ToString();
        Console.WriteLine(des);
    }
}

这里,图是SfDiagram的一个实例,Employee是基类。