читать детей из динамически заполненной стековой панели - PullRequest
0 голосов
/ 28 апреля 2020

, поэтому я динамически заполняю панель вложенного стека полями для ввода данных, во внутреннем StackPanel находится класс, который наследует StackPanel, но содержит тип данных и другие метаданные, я добавляю текстовый блок для метки и второй поле, которое генерируется динамически и может быть TextBox, ComboBox, CheckBox или другим. После ввода мне нужно собрать данные и переместить их в класс для обработки. Как я могу получить данные из внутреннего StackPannel? Я попытался foreach x in children, но это выдает ошибку для каждого объекта другого типа. Для упрощения я показываю код только для TextBox и CheckBox

private void _LoadData_Click(object sender, RoutedEventArgs e)
    {

        List<IEnteredData> enteredData= new List<IEnteredData>();
        enteredData= _ExtractEnteredData(FirsColumn, enteredData);
        enteredData= _ExtractEnteredData(SecondColumn, enteredData);
        foo(enteredData);
    }

    private List<IEnteredData> _ExtractEnteredData(StackPanel thisColumn, List<IEnteredData> enteredData)
    {
        foreach (StackPanelBatchInput entry in thisColumn.Children)
        {
            string enteredValue= null;
            foreach (TextBox textinput in entry.Children)
                enteredValue = textinput.Text;
            foreach (CheckBox checkBox in entry.Children)
            {
                if (checkBox.IsChecked  == true)
                    enteredValue = "true";
                else
                    enteredValue = "false";
            }

            if (enteredValue != null)
                enteredData.Add(AssignValueType(entry, enteredValue));
        }

        return enteredData;
    }

1 Ответ

1 голос
/ 28 апреля 2020

Я думаю, что проблема в том, что когда код попадает в foreach l oop, он извлекает первого потомка StackPanel и преобразует их, например, в StackPanelBatchInput . Но когда дочерний объект не относится к типу StackPanelBatchInput , вы получите исключение.

Попробуйте это для циклов foreach:

foreach (StackPanelBatchInput entry in thisColumn.Children.OfType<StackPanelBatchInput>())
{
     ...
     foreach (TextBox textinput in entry.Children.OfType<TextBox>())
        enteredValue = textinput.Text;
     ...
}

Это отфильтрует элементы указанного типа (например, TextBox, CheckBox, ...). Для получения дополнительной информации OfType <> ()

Если это не решит вашу проблему, вы можете опубликовать свой XAML-код и исключение, пожалуйста. Это будет более полезным для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...