/// <summary> /// Obtém o valor para uma BindableTextKey. /// </summary> /// <param name="key">A BindableTextKey.</param> /// <returns>O valor da BindableTextKey.</returns> private object GetBindableKeyValue(BindableTextKey key) { // Verifica se ainda não existe no cache. if (!m_bindableKeyValuesCache.ContainsKey(key.Name)) { // Obtém o objeto bindable. object bindableObject = GetBindable(key); object value = null; // Se for um bind sem propriedade. Ex.: {User}. if (String.IsNullOrEmpty(key.PropertyName)) { value = bindableObject; // Utiliza o próprio objeto como valor. } else // Se for um bind com propriedade. Ex.: {User.FullName}. { try { // Obtém o valor da propriedade. value = GetPropertyValue(bindableObject, key.PropertyName); } catch (InvalidOperationException ex) { // A propriedade não foi localizada no objeto. throw new InvalidOperationException( String.Format("The property '{0}' was not found on object '{1}'.", key.PropertyName, key.ObjectName), ex); } } // Armazena no cache. m_bindableKeyValuesCache[key.Name] = value; } return m_bindableKeyValuesCache[key.Name]; }
private bool ProcessConditionalKeys(BindableTextKey key) { // if and endif if (key.Name.Equals("#endif", StringComparison.OrdinalIgnoreCase)) { var topInStack = m_ifStack.Pop(); if (topInStack.Value) { m_text.Replace(key.NameWithPrefixAndSuffix, ""); } else { var newText = StringHelper.ReplaceBetween(m_text.ToString(), "", topInStack.Key, key.NameWithPrefixAndSuffix, false); m_text.Remove(0, m_text.Length); m_text.Append(newText); } return true; } else if (m_ifStack.Count > 0 && !m_ifStack.Peek().Value) { return true; } else if (key.Name.StartsWith("#if ")) { var ifValue = (bool)GetBindableKeyValue(key); if (ifValue) { m_text.Replace(key.NameWithPrefixAndSuffix, ""); } m_ifStack.Push(new KeyValuePair<string, bool>(key.NameWithPrefixAndSuffix, ifValue)); return !ifValue; } return false; }
/// <summary> /// Obtém um objeto bindable pela chave de binding. /// </summary> /// <param name="key">A BindableTextKey.</param> /// <returns>O objeto bindable localizado.</returns> private object GetBindable(BindableTextKey key) { if (m_bindables.ContainsKey(key.ObjectName)) { return m_bindables[key.ObjectName]; } else { // O objeto não foi localizado throw new InvalidOperationException(String.Format("Object '{0}' not found", key.ObjectName)); } }