2016-11-12 53 views
0

我正在使用Syncfusion WPF控件。我创建了一个显示径向树图的项目。获取所选节点的基本内容

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

图片:

enter image description here

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

所以我真的不知道如何从选择节点获取基类的属性,这是Node的数据。

希望大家都有道理,我自学成才。

这是我的主窗口代码:

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

     } 
    } 
} 

回答

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是我想要的属性,我现在可以从这里访问任何的基类的属性。

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

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的一个实例,并且员工是基类。

+0

感谢Keer,这个解决方案似乎比我的要干净。像这样的东西应该在Syncfusion文档中。 – Cnote