2016-11-12 31 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