Концептуально в шаблоне декоратора выходные данные одной обработки идут как входные данные для другой обработки.
Итак, в вашем случае это должно быть так:
getToppingFoo(getToppingBar(...(getXBaseSizePizzaCost())
, который разрешается в:
FooToppingCost + (BarToppingCost + ... ( Cost of pizza with base of X size )
Далее, вы можете определить фабричный класс для получения Pizza объекта различных размеров, скажем, Standard, Medium, Large. Логика одинакова независимо от того, какой язык вы выбираете.
Это кажется на необходимость в рекурсивной стандартной программе как GetTextBoxes ниже:
void Page_Loaded(object sender, RoutedEventArgs e)
{
// Instantiate a list of TextBoxes
List<TextBox> textBoxList = new List<TextBox>();
// Call GetTextBoxes function, passing in the root element,
// and the empty list of textboxes (LayoutRoot in this example)
GetTextBoxes(this.LayoutRoot, textBoxList);
// Now textBoxList contains a list of all the text boxes on your page.
// Find all the non empty textboxes, and put them into a list.
var nonEmptyTextBoxList = textBoxList.Where(txt => txt.Text != string.Empty).ToList();
// Do something with each non empty textbox.
nonEmptyTextBoxList.ForEach(txt => Debug.WriteLine(txt.Text));
}
private void GetTextBoxes(UIElement uiElement, List<TextBox> textBoxList)
{
TextBox textBox = uiElement as TextBox;
if (textBox != null)
{
// If the UIElement is a Textbox, add it to the list.
textBoxList.Add(textBox);
}
else
{
Panel panel = uiElement as Panel;
if (panel != null)
{
// If the UIElement is a panel, then loop through it's children
foreach (UIElement child in panel.Children)
{
GetTextBoxes(child, textBoxList);
}
}
}
}
Инстанцируйте пустого списка TextBoxes. Назовите GetTextBoxes, передающий в корневом управлении на Вашей странице (в моем случае, это - это. LayoutRoot), и GetTextBoxes должен рекурсивно циклично выполниться через каждый элемент UI, который является потомком того управления, тестируя, чтобы видеть, является ли это любой TextBox (добавьте его к списку), или панель, которая могла бы иметь потомков самих по себе для рекурсивного вызова через.
Надежда, которая помогает.:)
Я уже столкнулся с этой проблемой и уведомляю ее здесь: http://megasnippets.com/en/source-codes/silverlight/Get_all_child_controls_recursively_in_Silverlight
Здесь у Вас есть общий метод найти рекурсивно в VisualTree весь TextBoxes:
IEnumerable<DependencyObject> GetChildrenRecursively(DependencyObject root)
{
List<DependencyObject> children = new List<DependencyObject>();
children.Add(root);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
children.AddRange(GetChildrenRecursively(VisualTreeHelper.GetChild(root, i)));
return children;
}
Используйте этот метод как это для нахождения всего TextBoxes:
var textBoxes = GetChildrenRecursively(LayoutRoot).OfType<TextBox>();
От Вашей самой верхней панели можно сделать это (мою сетку называют ContentGrid),
var textBoxes = this.ContentGrid.Children.OfType<TextBox>();
var nonEmptyTextboxes = textBoxes.Where(t => !String.IsNullOrEmpty(t.Text));
foreach (var textBox in nonEmptyTextboxes)
{
//Do Something
}
Однако это только найдет текстовые поля, которые являются непосредственными детьми. Своего рода рекурсия как ниже помогла бы, но я думаю, что должен быть лучший путь.
private List<TextBox> SearchForTextBoxes(Panel panel)
{
List<TextBox> list = new List<TextBox>();
list.AddRange(panel.Children.OfType<TextBox>()
.Where(t => !String.IsNullOrEmpty(t.Text)));
var panels = panel.Children.OfType<Panel>();
foreach (var childPanel in panels)
{
list.AddRange(SearchForTextBoxes(childPanel));
}
return list;
}