/// <summary>
 /// Generates the xaml that is to be displayed.
 /// </summary>
 /// <param name="data">The data the xaml is constructed from.</param>
 /// <returns>The xaml representation of the input.</returns>
 public string GenerateXaml(TokenTree data)
 {
     if (_sb.Generated.Length <= 0)
     {
         TokenTree parameters = new TokenTree(data.GetChildren("Parameters"));
         DataConverter.Parameters = parameters;
         foreach (TokenTree child in parameters.Children)
         {
             string name = child.Name;
             TokenTree defaults = parameters.FindFirst("Defaults." + name);
             if (defaults != null)
                 foreach (TokenTree item in child.Children)
                     item.AddMissing(defaults);
         }
         TokenTreeList fields = data.GetAll("Fields");
         TokenTreeList styles = data.GetAll("Styles");
         _sb.Append(
             "<Border HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">")
             .AppendLine();
         if (styles != null && styles.Count > 0)
             AddStyles(styles, parameters);
         foreach (TokenTree field in fields.SelectMany(child => child.Children))
             _sb.AddElement(field, 1, parameters);
         _sb.Append("</Border>").AppendLine();
     }
     return _sb.Generated;
 }
        /// <summary>
        /// Generates the html that is to be displayed.
        /// </summary>
        /// <param name="data">The data the html is constructed from.</param>
        /// <param name="selected">The selected item for displaying.</param>
        /// <param name="dataName">The name of the data structure that contains item information.</param>
        /// <param name="keys">List of selectable items.</param>
        /// <returns>The html representation of the input.</returns>
        public string GenerateHtml(TokenTree data, TokenTree selected, string dataName, List<string> keys)
        {
            TokenTree parameters = new TokenTree(data.GetChildren("Parameters"));
            foreach (TokenTree child in parameters.Children)
            {
                string name = child.Name;
                TokenTree defaults = parameters.FindFirst("Defaults." + name);
                if (defaults != null)
                    foreach (TokenTree item in child.Children)
                        item.AddMissing(defaults);
            }
            _sb.Clear();
            TokenTree values = selected.Clone();
            TokenTree defaultValues = parameters.FindFirst("Defaults." + dataName);
            if (defaultValues != null)
                values.AddMissing(defaultValues);
            values.SetParameters(parameters);

            TokenTreeList fields = data.GetAll("Fields");
            TokenTreeList styles = data.GetAll("Styles").FindMatches("Style", true);
            AddStyles(styles, parameters);
            foreach (TokenTree field in fields.SelectMany(child => child.Children).Where(x => x.Name == "Field"))
                _sb.AddElement(field, 0, parameters, values, keys);
            return _sb.Generated;
        }