none
Validation.MarkInvalid zeigt keinen roten Rahmen RRS feed

  • Frage

  • Hallo,

    ich versuche in einem Dialog ein Control (bzw. dessen Bindung) programmatisch auf Invalid zu setzen. Dazu mache ich im Eventhandler des Savebuttons folgendes:

            private void btnSaveFilter_Click(object sender, RoutedEventArgs e) {
                if (Preferences.ServiceUrl == "ttt") {
                    txtServiceUrl.ToolTip = new ToolTip { Content = "ttt is not allowed" };
    
                    Validation.MarkInvalid(txtServiceUrl.GetBindingExpression(TextBox.TextProperty), new ValidationError(this.MyRule, txtServiceUrl.GetBindingExpression(TextBox.TextProperty)));
                } else {
                    Success = true;
                    Close();
                }
            }
    

    In XAML sieht das Control so aus:

            <TextBox Grid.Row="2" Grid.Column="1" x:Name="txtServiceUrl" 
                           FontWeight="Normal" FontFamily="Global User Interface" TextWrapping="NoWrap" Margin="8.925,4,10,0" Height="17" VerticalAlignment="Top" 
                     Text="{Binding ServiceUrl}"/>

    Wenn ich also  ttt eingeben und "Save" klicke, hat nach dem if-Zweig Validation.GetHasError(txtServiceUrl) dann auch den Wert false, wie ich im Debugger sehe. Aber der Zustand wird auf der Oberfläche nicht angezeigt, d.h.es wird kein roter Rahmen um die TextBox angezeigt, wie es ja standardmäßig passieren sollte.
    Was mache ich falsch?
    Montag, 23. November 2009 12:14

Antworten

  • Ich habe die Lösung gefunden. Das DialogFenster besitzt bei mir einen eigenen Style mit ControlTemplate und ContentPresenter. Und da muss um den  ContentPresenter <AdornerDecorator>...</AdornerDecorator> hinzugefügt werden, damit das ErrorTemplate zieht.

    Trotzdem vielen Dank,  Guenter!
    • Als Antwort markiert Jerma Mittwoch, 25. November 2009 19:56
    Mittwoch, 25. November 2009 19:55

Alle Antworten

  • Wo hast du gelesen das standardmäßig ein roter Rahmen angezeigt wird?

    Ich mache es über einen Trigger.

    <Style.Triggers>
    
    	<Trigger 
    		Property="Validation.HasError"
    		Value="True"
    		>
    		<Setter 
                Property="ToolTip" 
                Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" 
                />
    	</Trigger>
    
    </Style.Triggers>
    Montag, 23. November 2009 13:25
  • Wo hast du gelesen das standardmäßig ein roter Rahmen angezeigt wird?
    Z.B. hier:

    "If your Binding has associated validation rules but you do not specify an ErrorTemplate on the bound control, a default ErrorTemplate will be used to notify users when there is a validation error. The default ErrorTemplate is a control template that defines a red border in the adorner layer." (Quelle: http://msdn.microsoft.com/en-us/library/ms752347.aspx)

    Eigentlich müsste das also gehen, denke ich.
    Montag, 23. November 2009 13:45
  • Das mit dem default ErrorTemplate habe ich übersehen. Gut zu wissen, hin und wieder reicht die rote Umrandung völlig aus.

    Das Beispiel unten funktioniert bei mir, ich nehme also an der Fehler liegt bei dir in deiner ValidationRule. Setz mal einen Breakpoint in der Validation Methode und schau was dort passiert.

    Xaml:

    <Window x:Class="WpfApplication1.Window9"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window9" Height="300" Width="300">
        <Grid>
    		<TextBox 
    			Text="{Binding ServiceUrl}"
    			Height="23" HorizontalAlignment="Left"
    			Margin="10,10,0,0" 
    			Name="_textBox" 
    			VerticalAlignment="Top" 
    			Width="120" 
    			/>
    		
    		<Button 
    			Height="23" 
    			HorizontalAlignment="Left" 
    			Margin="10,43,0,0" 
    			Name="_okButton" 
    			VerticalAlignment="Top" 
    			Width="75" 
    			Click="_okButton_Click"
    			>
    			Ok
    		</Button>
    	</Grid>
    </Window>
    

    C#:

    public partial class Window9 : Window
    {
    	public Window9()
    	{
    		InitializeComponent();
    		this.DataContext = this;
    	}
    
    	private void _okButton_Click(object sender, RoutedEventArgs e)
    	{
    		if (_textBox.Text == "ttt")
    		{
    			_textBox.ToolTip = new ToolTip { Content = "ttt is not allowed" };
    
    			Validation.MarkInvalid(_textBox.GetBindingExpression(TextBox.TextProperty),
    				new ValidationError(new MyRule(),
    					_textBox.GetBindingExpression(TextBox.TextProperty)));
    		}
    		else
    		{				
    			Close();
    		}
    
    	}
    
    	public string ServiceUrl { get; set; }
    }
    
    public class MyRule : ValidationRule
    {
    	public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    	{
    		return new ValidationResult(false, "Nicht ok");
    	}
    }



    Hope that helps.

    Montag, 23. November 2009 16:52
  • Ich habe die Lösung gefunden. Das DialogFenster besitzt bei mir einen eigenen Style mit ControlTemplate und ContentPresenter. Und da muss um den  ContentPresenter <AdornerDecorator>...</AdornerDecorator> hinzugefügt werden, damit das ErrorTemplate zieht.

    Trotzdem vielen Dank,  Guenter!
    • Als Antwort markiert Jerma Mittwoch, 25. November 2009 19:56
    Mittwoch, 25. November 2009 19:55