Любопытно, есть ли другой способ проверить все TextBox в ListView - PullRequest
3 голосов
/ 06 апреля 2011

Вот то, что у меня есть .... показано является частью ListView.В настоящее время происходит следующее: пользователь нажимает кнопку «Создать», чтобы создать новую строку.Пользователь может или не может вводить информацию в содержащиеся текстовые поля / комбинированные списки до нажатия кнопки Сохранить.При нажатии кнопки «Сохранить» выполняется приведенный ниже код C #, который использует VisualTreeHelper, чтобы найти все TextBoxes / ComboBoxes в ListView и убедиться, что пользователь ввел текст / выбрал элемент.Если они не имеют, он устанавливает BorderBrush красным и не позволяет ObjectContext сохранять изменения.Я знаю, что вы можете использовать ValidationRule в некоторых случаях ... но я не мог понять, как заставить его проверить новую строку, которая никогда не была выбрана / изменена до нажатия кнопки Сохранить.Это работает, но было бы любопытно, если бы был более элегантный способ.

XAML

 <ListView.View>
            <GridView>
                <GridViewColumn x:Name="nameColumn" Header="Name" Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Margin="-6,-1" >
                                <TextBox.Text>
                                    <Binding Path="Name" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                                        <Binding.ValidationRules>
                                            <me:TextInputValidator />
                                        </Binding.ValidationRules>
                                    </Binding>
                                </TextBox.Text>
                            </TextBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

C #

 Stack<FrameworkElement> tree = new Stack<FrameworkElement>();
            tree.Push(subcategoryListView);

            while (tree.Count > 0)
            {
                FrameworkElement current = tree.Pop();

                int count = VisualTreeHelper.GetChildrenCount(current);
                for (int i = 0; i < count; ++i)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(current, i);
                    if (child is FrameworkElement)
                        tree.Push((FrameworkElement)child);
                    if (child is TextBox)
                    {
                        TextBox tempBox = child as TextBox;
                        if (string.IsNullOrEmpty(tempBox.Text))
                        {
                            tempBox.BorderBrush = new SolidColorBrush(Colors.Red);
                            errorsOnPage = true;
                        }

                    }
                    if (child is ComboBox)
                    {
                        ComboBox tempCombo = child as ComboBox;
                        if (tempCombo.SelectedIndex == -1)
                        {
                            tempCombo.BorderBrush = new SolidColorBrush(Colors.Red);
                            errorsOnPage = true;
                        }
                    }
                }
            }

            if (!errorsOnPage)
            {
                dbcontext.SaveChanges();
                MessageBox.Show("Saved", null, MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                MessageBox.Show("Highlighted fields are missing or invalid.", null, MessageBoxButton.OK, MessageBoxImage.Stop);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error encountered while saving", null, MessageBoxButton.OK, MessageBoxImage.Stop);
        }
...