Frage

WPF Validierungssystem führt intial validatation eines Objekts (ich meine - alle Felder validiert werden, wenn ein Databound Artikel geändert wird, und die Ergebnisse werden auf der Benutzeroberfläche angezeigt). Aber es funktioniert nicht wie diese, wenn ich ein Steuerelement dynamisch hinzufügen. In einem solchen Fall inital Validierung geschieht, aber die Ergebnisse sind nicht auf dem ui gezeigt. Erst nach einigen Eigenschaften auf einem Databound-Objekt zu ändern, arbeitet richtig beginnt alles. Hier ist eine rohe Probe.

Angenommen, wir haben MyObject-Klasse

 public class MyObject : INotifyPropertyChanged, IDataErrorInfo
 {
    public string Name { /*get, set implementation */}        

    // IDataErrorInfo
    public string this[string columnName]
    {
        get
        {
            if (String.IsNullOrEmpty(Name)) return "Name can't be empty!";
            return String.Empty;
        }
    }
    /* etc. */
}

Und einige Benutzer die Kontrolle, sagen MyUserControl, die die Bearbeitung von MyObject Objekte ermöglicht. Es kann irgendwie so aussehen:

<UserControl x:Class="Test.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Name: "/>
            <TextBox Text="{Binding Name, ValidatesOnDataErrors=True}" Width="200"/>
        </StackPanel>
</UserControl>

Nun, wenn diese Steuerung in das Hauptfenster in XAML hinzugefügt wird (oder hinter in Code in Konstruktor oder Fenster geladen Ereignis), als wenn MyCustomControl.DataContext auf eine neue Instanz der MyObject-Klasse festgelegt ist, wird das Feld Name sofort validiert und Fehlerbenachrichtigung wird unter Verwendung von Validierungsfehler Vorlage angezeigt. Aber wenn MyCustomControl hinzugefügt wird dynamisch (nach etwa Schaltfläche geklickt wird), Erstvalidierung geschieht aber ui nicht enden Ergebnisse zeigen (keine roten Rand etc.)

Nehmen wir an, dass Anwendungsfenster eines DockPanel bestehen (DockPanel) und eine Taste:

public Window1()
        {
            InitializeComponent();

            button.Click +=new RoutedEventHandler(OnButtonClick);

            /*
            // in this case validation works correctly,
            // when window is shown Name textbox already got a red border etc.
            var muc = new MyUserControl();
            dockPanel.Children.Add(muc);
            muc.DataContext = new MyObject(); 
            */
        }


        private void OnButtonClick(object sender, RoutedEventArgs e)
        {
            // in this case validatation works, but no results are shown on the ui
            // only after Name property is changed (then removed again) red border appears
            var muc = new MyUserControl();
            dockPanel.Children.Add(muc);
            muc.DataContext = new MyObject(); 
        }

Warum?

War es hilfreich?

Lösung

Ok, fand ich irgendwie eine Antwort. Das ist Problem mit Adorner Schicht. Unsere WPF-Gurus begegnet es bereits und lieferte einige Lösung. Siehe Karl Shifflett des Post .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top