none
WPF: Datenbindung mit Validierung RRS feed

  • Frage

  • Hallo,

    ich habe ein Problem, ich kämpfe mich gerade durch das Thema Datenbindung mit Validierung. Erstmal vorab mein Code.

    Klasse für Einstellungen:

    Public Class Settings
      Inherits ValidationRule
    
      Public Property Min As Integer
      Public Property MinValue As Integer
    
      Public Overrides Function Validate(ByVal value As Object, ByVal cultureInfo As System.Globalization.CultureInfo) As System.Windows.Controls.ValidationResult
        Return Nothing
      End Function
    End Class

    Fenster:

    <Window x:Class="MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525">
      <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120">
          <TextBox.Text>
            <Binding Path="Min" UpdateSourceTrigger="PropertyChanged">
              <Binding.ValidationRules>
                <local:Settings MinValue="0"/>
              </Binding.ValidationRules>
            </Binding>
          </TextBox.Text>
        </TextBox>
      </Grid>
    </Window>
    

    Jetzt bekomme ich die Fehlermeldung:

    Fehler 1 Der local:Settings-Typ wurde nicht gefunden. Alle Assemblyverweise müssen vorhanden sein, und alle Assemblys, auf die verwiesen wird, müssen erstellt worden sein. G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 10 26 WpfApplication2

    Die Klasse und das Fenster befinden sich in einem un dem selben Projekt(und auch Namespace). Ich verstehe das nicht, irgendetwas muss da fehlen, ich weiß bloß nicht was.

    Danke für jede Hilfe.

    --

    Gruß Scotty

    Mittwoch, 16. Juni 2010 07:21

Antworten

  • Hallo Scotty,

    Schau Dir mal diese Diskussionsfäden an. Vielleicht Vielleicht können sie Dir weiterhelfen.

    How to: Using Binding in an Custom Validation Rule

    Add custom ValidationRule on a Control via code (not XAML)

    Habe noch reine Theoretische Artikel gefunden.

    Data Validation in 3.5

    Übersicht über Datenbindung

     

    Fehlt hier die Klasse „Settings“ von <local:Settings MinValue="0"/> ?

     

    Grüße,

    Robert

    Mittwoch, 16. Juni 2010 08:42
    Moderator
  • Hi Karsten,
    dein Fenster (Window) wei�? nicht, was dein Aliasname "local" bedeutet. Für den Aliasnamen musst du noch einen Verweis einbinden, d.h. einen Verweis auf den Namensraum, wo sich deine Klasse Settings befindet. wenn sich die Settings-Klasse im Namensraum WpfApplication1 befindet, sieht die Lösung so aus:

    <Window x:Class="MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</ SPAN>
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525"
         xmlns:local="clr-namespace:WpfApplication1">
     <Grid>
      <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120">
       <TextBox.Text>
        <Binding Path="Min" UpdateSourceTrigger="PropertyChanged">
         <Binding.ValidationRules>
          <local:Settings MinValue="0"/>
         </Binding.ValidationRules>
        </Binding>
       </TextBox.Text>
      </TextBox>
     </Grid>
    </Window>
    

    --
    Viele Gruesse
    Peter

     
     
    Mittwoch, 16. Juni 2010 08:59
  • Hallo Karsten,

    zum Thema "Visual Studio Projekt auf Netzlaufwerken" gab es ja schon einige Diskussionen. Die Kernaussage war: Sollte man vermeiden. Am elegantesten umgeht man das hin- und herkopieren mit einer Sourcecodeverwaltung, sei es TFS Basic oder Subversion. Damit hat man auch noch paar andere Vorteile.

    Work With .NET Projects From a Network Share
    http://weblogs.asp.net/rmclaws/archive/2007/03/22/work-with-net-projects-from-a-network-share.aspx

    Vielleicht kannst Du damit ja Dein Problem lösen. Wobei die Security Beschränkung ab .NET 3.5 SP1 aufgehoben sein soll.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Samstag, 26. Juni 2010 10:33
    Moderator

Alle Antworten

  • Hallo Scotty,

    Schau Dir mal diese Diskussionsfäden an. Vielleicht Vielleicht können sie Dir weiterhelfen.

    How to: Using Binding in an Custom Validation Rule

    Add custom ValidationRule on a Control via code (not XAML)

    Habe noch reine Theoretische Artikel gefunden.

    Data Validation in 3.5

    Übersicht über Datenbindung

     

    Fehlt hier die Klasse „Settings“ von <local:Settings MinValue="0"/> ?

     

    Grüße,

    Robert

    Mittwoch, 16. Juni 2010 08:42
    Moderator
  • Hi Karsten,
    dein Fenster (Window) wei�? nicht, was dein Aliasname "local" bedeutet. Für den Aliasnamen musst du noch einen Verweis einbinden, d.h. einen Verweis auf den Namensraum, wo sich deine Klasse Settings befindet. wenn sich die Settings-Klasse im Namensraum WpfApplication1 befindet, sieht die Lösung so aus:

    <Window x:Class="MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</ SPAN>
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525"
         xmlns:local="clr-namespace:WpfApplication1">
     <Grid>
      <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120">
       <TextBox.Text>
        <Binding Path="Min" UpdateSourceTrigger="PropertyChanged">
         <Binding.ValidationRules>
          <local:Settings MinValue="0"/>
         </Binding.ValidationRules>
        </Binding>
       </TextBox.Text>
      </TextBox>
     </Grid>
    </Window>
    

    --
    Viele Gruesse
    Peter

     
     
    Mittwoch, 16. Juni 2010 08:59
  •      xmlns:local="clr-namespace:WpfApplication1">

    Hallo Peter,

    das hatte ich auch schon ausprobiert, dabei passiert aber beim Versuch den Designer anzuzeigen das:

    Fehler 1 Die Metadaten für die Assembly "WpfApplication2" konnten nicht geladen werden. Möglicherweise wurde diese Assembly aus dem Web heruntergeladen. Siehe http://go.microsoft.com/fwlink/?LinkId=179545. Fehler: Die Datei oder Assembly "WpfApplication2" oder eine Abhängigkeit davon wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515) G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 1 1 WpfApplication2

    Fehler 2 Der local:Settings-Typ wurde nicht gefunden. Alle Assemblyverweise müssen vorhanden sein, und alle Assemblys, auf die verwiesen wird, müssen erstellt worden sein. G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 11 26 WpfApplication2

    Merkwürdigerweise lässt sich die Anwendung aber kompilieren und ausführen.

    --

    Gruß Scotty

    Donnerstag, 17. Juni 2010 04:23
  •  
    "Karsten Sosna" schrieb im Newsbeitrag news:85005a4d-f10c-4fff-96be-6a6697d766d9...
    ....

    Fehler 1 Die Metadaten für die Assembly "WpfApplication2" konnten nicht geladen werden. Möglicherweise wurde diese Assembly aus dem Web heruntergeladen. Siehe http://go.microsoft.com/fwlink/?LinkId=179545. Fehler: Die Datei oder Assembly "WpfApplication2" oder eine Abhängigkeit davon wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515) G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 1 1 WpfApplication2

    Fehler 2 Der local:Settings-Typ wurde nicht gefunden. Alle Assemblyverweise müssen vorhanden sein, und alle Assemblys, auf die verwiesen wird, müssen erstellt worden sein. G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 11 26 WpfApplication2

    Hi Karsten,
    der Fehler wird angezeigt, wenn die Assembly dem Designer nicht zur Verfügung steht. Das kann beispielsweise der Fall sein, wenn sich sowohl UI als auch Logik in der gleichen Assembly befinden und diese in der IDE geändert wurde. Da der Designer nicht entscheiden kann, ob er die alte ungeänderte Assembly nutzen soll oder erst einmal einen Übersetzungslauf starten soll, überlässt er die Entscheidung dem Anwender, indem er ihn anzeigt, dass er keine aktuelle Assembly findet.

    Merkwürdigerweise lässt sich die Anwendung aber kompilieren und ausführen.

    Logisch, da mit dem Übersetzungslauf bei Fehlerfreiheit eine Assembly zur Verfügung gestellt wird.

    Das Problem kannst du umgehen, indem du UI und Logik trennst (separate Projekte) und nach Änderungen in der Logik erst einmal eine fehlerfreie Assembly erstellst. Beachten solltest du dabei, dass sich die vom Designer genutzte Assembly in der IDE befindet und ggf. erforderliche Nutzereinstellungen (z.B. ConnectString in den Settings) auch zur IDE gehören. Diesen Fall solltest du durch geeignete Maßnahmen abfangen, damit die Assembly bei Nutzung im Designer keine Fehler bringt. Das kann man beispielsweise mit machen mit:

      Private Sub InitEndPoint()
       ws = New xxx.xxxSoapClient
       If Not System.Diagnostics.Debugger.IsAttached Then
        ws.Endpoint.Address = New EndpointAddress("http://xxx.xxx.de/xxx.asmx")
       End If
      End Sub
    

    --
    Viele Gruesse
    Peter

    Donnerstag, 17. Juni 2010 06:19
  •      xmlns:local="clr-namespace:WpfApplication1">

    das hatte ich auch schon ausprobiert, dabei passiert aber beim Versuch den Designer anzuzeigen das:

    Fehler 1 Die Metadaten für die Assembly "WpfApplication2" konnten nicht geladen werden. Möglicherweise wurde diese Assembly aus dem Web heruntergeladen. Siehe http://go.microsoft.com/fwlink/?LinkId=179545. Fehler: Die Datei oder Assembly "WpfApplication2" oder eine Abhängigkeit davon wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515) G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 1 1 WpfApplication2

    Fehler 2 Der local:Settings-Typ wurde nicht gefunden. Alle Assemblyverweise müssen vorhanden sein, und alle Assemblys, auf die verwiesen wird, müssen erstellt worden sein. G:\Development\VB.NET 2010\testprojects\WPF\WpfApplication2\MainWindow.xaml 11 26 WpfApplication2

    Merkwürdigerweise lässt sich die Anwendung aber kompilieren und ausführen.

    Dafür habe ich jetzt Ursache gefunden. Meine gesamte Entwicklung liegt auf meinem Server(File-Server, ganz normales Netzwerk). Wenn ich das Projekt von dort lade, erhalte ich die Fehler. Kopiere ich das Projekt aber nun auf ein lokales Laufwerk und lade es dann, dann sind die Fehler weg und der Designer zeigt das Window an.

    Dafür brauche ich jetzt dringends eine Lösung. Ich will nicht jedes mal die Projekte hin und her kopieren.

    --

    Gruß Scotty

    Donnerstag, 17. Juni 2010 06:26
  • Das Problem kannst du umgehen, indem du UI und Logik trennst (separate Projekte) und nach Änderungen in der Logik erst einmal eine fehlerfreie Assembly erstellst.

    Hallo Peter,

    das habe ich probiert, jetzt erhalte ich:

    Fehler 1 Das Tag "Setting" ist im XML-Namespace "clr-namespace:ClassLibrary1" nicht vorhanden. Zeile 11 Position 26. G:\Development\VB.NET 2010\TestProjects\WPF\WpfApplication2\MainWindow.xaml 11 26 WpfApplication2

    Fehler 2 Der local:Setting-Typ wurde nicht gefunden. Alle Assemblyverweise müssen vorhanden sein, und alle Assemblys, auf die verwiesen wird, müssen erstellt worden sein. G:\Development\VB.NET 2010\TestProjects\WPF\WpfApplication2\MainWindow.xaml 11 26 WpfApplication2

    Ich habe eine ClassLibrary erstellt und dort meine Setting-Klasse hinein geschoben. Das Projekt kompiliert ind in der Wpf-Anwendung einen Verweis auf diese Dll gesetzt. Dann habe ich den XAML-Code wie folgt geändert:

    <Window x:Class="MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:ClassLibrary1"
      Title="MainWindow" Height="350" Width="525">
      <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="10,10,0,0" Name="TextBox1" VerticalAlignment="Top" Width="120">
          <TextBox.Text>
            <Binding Path="Min" UpdateSourceTrigger="PropertyChanged">
              <Binding.ValidationRules>
                <local:Setting MinValue="0"/>
              </Binding.ValidationRules>
            </Binding>
          </TextBox.Text>
        </TextBox>
      </Grid>
    </Window>
    

    An meiner Setting-Klasse habe ich nichts geändert. Wie schon im anderen Posting erwähnt, tritt der Fehler nur beim Laden vom Netzlaufwerk auf.

    --

    Gruß Scotty

    Donnerstag, 17. Juni 2010 07:03
  • Hallo Karsten,

    zum Thema "Visual Studio Projekt auf Netzlaufwerken" gab es ja schon einige Diskussionen. Die Kernaussage war: Sollte man vermeiden. Am elegantesten umgeht man das hin- und herkopieren mit einer Sourcecodeverwaltung, sei es TFS Basic oder Subversion. Damit hat man auch noch paar andere Vorteile.

    Work With .NET Projects From a Network Share
    http://weblogs.asp.net/rmclaws/archive/2007/03/22/work-with-net-projects-from-a-network-share.aspx

    Vielleicht kannst Du damit ja Dein Problem lösen. Wobei die Security Beschränkung ab .NET 3.5 SP1 aufgehoben sein soll.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Samstag, 26. Juni 2010 10:33
    Moderator