Ошибки проверки WPF: как показать в отдельном TextBlock, а не во всплывающей подсказке - PullRequest
2 голосов
/ 19 июля 2011

Я думаю, что я действительно схожу с ума, но я не могу найти решение для отображения ошибок проверки не во всплывающей подсказке, а в отдельном текстовом блоке, который не имеет ничего общего с TextBox, в который вводит пользователь.

Я хочу иметь один TextBlock, содержащий сводную информацию о проверке, независимо от того, в каком текстовом поле пользователь вводит.

Знаете ли вы решение для такого поведения?

EDIT: Моя текущая реализация выглядит примерно так:

<TextBox Margin="{StaticResource WinHorizontalMargin}" 
         Style="{StaticResource WinInputBoxNormalStyle}">
   <TextBox.Text>
      <Binding Path="AccessCode" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
         <Binding.ValidationRules>
            <ValidationRules:MandatoryValidationRule Field="Access Code"/> 
         </Binding.ValidationRules>
      </Binding>
   </TextBox.Text>
</TextBox>

<!-- Content Error Message -->
<TextBlock Grid.Row="2" Grid.ColumnSpan="2" Text="{Binding Path=(Validation.Errors)[0].ErrorContent}">
</TextBlock>

Спасибо - Герхард

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Вы можете использовать BindingGroup для сетки и проверять все, когда пользователь отправляет форму.

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WpfApplication1="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <WpfApplication1:ErrorsToMessageConverter x:Key="e2mConverter"/>
    </Window.Resources>
    <Grid x:Name="TheGrid">

        <Grid.BindingGroup>
            <BindingGroup Name="UserInputBindingGroup">
                <BindingGroup.ValidationRules>
                    <WpfApplication1:MandatoryValidationRule/>
                </BindingGroup.ValidationRules>
            </BindingGroup>
        </Grid.BindingGroup>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBox x:Name="theTextBox">
            <TextBox.Text>
                <Binding Path="AccessCode" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">                            
                </Binding>
            </TextBox.Text>
        </TextBox>

        <!-- Content Error Message -->
        <TextBlock Grid.Row="1" Text="{Binding ElementName=TheGrid, Path=(Validation.Errors), Converter={StaticResource e2mConverter}}">
        </TextBlock>

        <Button Grid.Row="2" Content="Submit" Click="Button_Click" />
    </Grid>
</Window>

Событие нажатия кнопки фиксирует BindingGroup для сетки, как показано здесь:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.TheGrid.BindingGroup.CommitEdit();
}

Для DataContext окна задан класс

public class UserInputValues
{
    public string AccessCode { get; set; }
}

Проверкапроисходит в методе проверки класса MandatoryValidationRule

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
    BindingGroup bindingGroup = (BindingGroup) value;
    UserInputValues userInputValues = (UserInputValues) bindingGroup.Items[0];


    object accessCode = bindingGroup.GetValue(userInputValues, "AccessCode");

    // Validation code here...

    return new ValidationResult(false, "No no no!");
}
1 голос
/ 20 июля 2011

Привязка TextBlock с помощью привязки ElementName к TextBox, предоставляющему уведомление о ошибках .Вы также можете написать конвертер, который преобразует набор ошибок валидации в текст, чтобы его было легче представить в отдельном текстовом блоке.

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