2016-04-07 14 views
0

Ich schreibe einen (ursprünglich) einfachen XML-Konfigurationseditor für meine App.Wie würde ich diese deserialisierten XML-Knoten neu anordnen?

Es lädt eine bestimmte Gruppe von Elementen (die aus einem Dropdown-Menü ausgewählt werden können) aus einem .xml-Dokument und ermöglicht es dem Benutzer, sie in einem DataGrid zu bearbeiten und hinzuzufügen.

Ich fand das Laden der XML in das DataGrid, wo es von einer vorherigen Frage bearbeitet werden kann, die ich fragte.

Meine letzte Hürde ist, dass der Benutzer die Zeilen im DataGrid neu anordnen möchte, und ich habe keinen guten Weg gefunden, dies zu tun, ohne viel Code zu schreiben, der aktualisiert werden müsste, wenn ein neuer Knoten war hinzugefügt werden.

Aktuelle GUI zum Bearbeiten einer .xml-Konfigurationsdatei.

Current xml config editor GUI

Beispiel der XML-Konfigurationsdatei:

<?xml version="1.0" encoding="utf-8"?> 
<Configurations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<FlameScanners> 
    <MenuChoice>Fireye 48PT2 </MenuChoice> 
    <Body>Fireye 48PT2 </Body> 
    <Cost>0</Cost> 
    </FlameScanners> 
    <FlameScanners> 
    <MenuChoice>Fireye 85 Series </MenuChoice> 
    <Body>Fireye 85 Series </Body> 
    <Cost>0</Cost> 
    </FlameScanners> 
    <FlameScanners> 
    <MenuChoice>Fireye 95 Series </MenuChoice> 
    <Body>Fireye 95 Series </Body> 
    <Cost>0</Cost> 
    </FlameScanners> 
    <FlameScanners> 
    <MenuChoice>-by others-</MenuChoice> 
    <Body>-by others-</Body> 
    <Cost>0</Cost> 
    </FlameScanners> 
</Configurations> 

Und ein Ausschnitt aus dem entsprechenden Code all diese Handhabung:

private Configurations deserializedXML; 
public ConfigEditorWindow() 
{ 
    InitializeComponent(); 
    fillSectionDropdown(); 
    this.deserializedXML = Deserialize<Configurations>(); 
} 

private void comboBox_Section_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (isComboBoxLoaded == false) 
     return; 
    switch (comboBox_Section.SelectedValue.ToString()) 
    { 
     case "FlameScanners": 
      dataGrid.ItemsSource = deserializedXML.FlameScanners; 
      break; 
      ... 
      ... 
      ... 
    } 
} 
private static T Deserialize<T>() where T : new() 
{ 
    // Create an instance of T 
    T ReturnListOfT = CreateInstance<T>(); 

    // Create a new file stream for reading the XML file 
    using (FileStream ReadFileStream = new FileStream(ConfigFile, FileMode.Open, FileAccess.Read, FileShare.Read)) 
    { 
     // Construct a XmlSerializer and use it 
     // to serialize the data from the stream. 
     XmlSerializer SerializerObj = new XmlSerializer(typeof(T)); 
     try 
     { 
      // Deserialize the hashtable from the file 
      ReturnListOfT = (T)SerializerObj.Deserialize(ReadFileStream); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(string.Format("Failed to serialize. Reason: {0}", ex.Message)); 
     } 
    } 
    // return the Deserialized data. 
    return ReturnListOfT; 
} 

[XmlRoot(ElementName = "FlameScanners")] 
public class FlameScanners 
{ 
    [XmlElement(ElementName = "MenuChoice")] 
    public string MenuChoice { get; set; } 
    [XmlElement(ElementName = "Body")] 
    public string Body { get; set; } 
    [XmlElement(ElementName = "Cost")] 
    public string Cost { get; set; } 
} 
... //Repeated for each element in the config file 
... 
[XmlRoot(ElementName = "Configurations")] 
public class Configurations 
{ 

    [XmlElement(ElementName = "Scope")] 
    public List<Scope> Scope { get; set; } 

    [XmlElement(ElementName = "Company")] 
    public List<Company> Company { get; set; } 

    [XmlElement(ElementName = "ControlStrategies")] 
    public List<ControlStrategies> ControlStrategies { get; set; } 

    [XmlElement(ElementName = "CustomerSpecs")] 
    public List<CustomerSpecs> CustomerSpecs { get; set; } 

    [XmlElement(ElementName = "SystemSpecs")] 
    public List<SystemSpecs> SystemSpecs { get; set; } 

    [XmlElement(ElementName = "ControlSystem")] 
    public List<ControlSystem> ControlSystem { get; set; } 

    [XmlElement(ElementName = "CsHw")] 
    public List<CsHw> CsHw { get; set; } 

    [XmlElement(ElementName = "FlameScanners")] 
    public List<FlameScanners> FlameScanners { get; set; } 

    [XmlElement(ElementName = "Enclosures")] 
    public List<Enclosures> Enclosures { get; set; } 

    [XmlElement(ElementName = "Options")] 
    public List<Options> Options { get; set; } 

    [XmlElement(ElementName = "Documents")] 
    public List<Documents> Documents { get; set; } 

    [XmlElement(ElementName = "Notes")] 
    public List<Notes> Notes { get; set; } 
} 

Auf meine Frage zu wiederholen; Was wäre der beste Weg, eine bestimmte Zeile im dataGrid neu anzuordnen? Ich weiß, dass ich die Daten ändern, die das Datagrid verknüpft ist, so dass ich dachte, vielleicht etwas zu tun:

if (dataGrid.SelectedItem == null || dataGrid.SelectedIndex <= 0 || dataGrid.SelectedIndex > deserializedXML.Company.Count-1) 
       return; 
      Company c = deserializedXML.Company[dataGrid.SelectedIndex]; 
      deserializedXML.Company.RemoveAt(dataGrid.SelectedIndex); 
      deserializedXML.Company.Insert(dataGrid.SelectedIndex - 1, c); 
      dataGrid.Items.Refresh(); 

Dies würde jedoch muß in einer switch-Anweisung sein, je nachdem, welches Element der Benutzer derzeit angezeigt. Kann jemand einen einfacheren Weg sehen?

Danke!

Antwort

0

Nach einigem Graben durch meinen Code, habe ich beschlossen, der beste Weg, restrukturieren war, wie ich die Konfigurationselemente wurde zu speichern.

Anstatt für jedes Element eine andere Klasse zu verwenden (z. B. eine Scope-Klasse und eine Company-Klasse), habe ich eine Klasse erstellt, die für jedes Konfigurationselement geeignet ist.

Auf diese Weise könnte ich ein öffentliches Mitglied der Configurations-Klasse CurrentSelected haben. Welche ich aktualisieren würde, wenn der Benutzer ein anderes Element anzeigen wollte. Dann, wenn sie einen Artikel neu anordnen wollten. Ich könnte nur Änderungen am CurrentSelected-Mitglied vornehmen.

Das hat mich davor bewahrt, jedes Mal, wenn ich ein neues Konfigurationselement wollte, viel Code hinzufügen zu müssen.

Verwandte Themen