Laden...

XAML Validierung für Member wie bei Styles und Settern

Erstellt von Palladin007 vor 8 Jahren Letzter Beitrag vor 8 Jahren 796 Views
Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 8 Jahren
XAML Validierung für Member wie bei Styles und Settern

Hi,

ist es möglich, im XAML-Code eine PropertyInfo zu verlangen und zur Entwicklungszeit zu validieren?
Dazu ist dann natürlich der Quell-Typ bekannt, damit geprüft werden kann, ob die Property darin vor kommt.

Ich möchte das so, wie es auch bei Style und Setter geschieht.
Ich kann nur die Properties angeben, die es tatsächlich in dem Typ gibt.
Für Value wird dann sogar eine Intellisense angeboten, wenn es z.B. ein Enum ist.

Kann man dieses Verhalten irgendwie nach bauen?

Beste Grüße

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

5.299 Beiträge seit 2008
vor 8 Jahren

ich weiß nicht genau, was du meinst, aber konzeptionell ist schon ansatzweise vorgesehen, dass das Binding-Setting zumindest mit Intellisense-Hilfe geschieht - wenn auch dieses Feature hoffnungslos unausgereift ist.
Und man muss die Anwendung auch in geeigneter Weise strukturieren, also DataContexte nicht im CodeBehind setzen, sondern im Xaml.
Alternativ den Ignorable:d - Namespace nutzen - aber Xaml-Entwicklung inklusive Test-Daten unterstützt der leider nicht.

Guggmol https://www.vb-paradise.de/index.php/Thread/83442-MVVM-Binding-Picking-im-Xaml-Editor/
Film und Tut beschäftigen sich bisserl damit.

Der frühe Apfel fängt den Wurm.

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 8 Jahren

Ich versuche es mal mit einem Beispiel:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
public class MyControl : UserControl
{
    public static DependencyProperty SourceTypeProperty = DependencyProperty.Register(nameof(SourceType), typeof(Type), typeof(MyControl), new PropertyMetadata());
    public static DependencyProperty SourcePropertyProperty = DependencyProperty.Register(nameof(SourceProperty), typeof(PropertyInfo), typeof(MyControl), new PropertyMetadata());

    public Type SourceType
    {
        get { return (Type)GetValue(SourceTypeProperty); }
        set { SetValue(SourceTypeProperty, value); }
    }
    public PropertyInfo SourceProperty
    {
        get { return (PropertyInfo)GetValue(SourcePropertyProperty); }
        set { SetValue(SourcePropertyProperty, value); }
    }
}
<local:MyControl SourceType="{x:Type local:Person}" SourceProperty="Name" x:Key="test" />

<Style TargetType="local:MyControl">
    <Setter Property="SourceType" Value="{x:Type local:Person}" />
</Style>

Für SourceProperty sollen, wenn SourceType gesetzt ist, nur Id, Name und Birthdate möglich sein.
Ist das irgendwie möglich?

Beim Style ist das ja auch irgendwie umgesetzt.
Ich kann für die enthaltenen Setter nur Properties fest legen, die im TargetType vorhanden sind, bzw. im Typ FrameworkElement.
So wird mir, weil ich TargetType auf local:MyControl gesetzt habe, im Setter für Property jede mögliche Property, enschließlich SourceType und SourceProperty, vorgeschlagen und validiert.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

5.299 Beiträge seit 2008
vor 8 Jahren

nicht dass ich wüsste.
Intellisense kriegste nur, wenn du Bindings setzt, nicht, wenn du Property-Infos oder sowas zuweisen willst.

Wie das gemacht ist, dazu müsstest du wohl den Style-SourceCode angucken - disassemblieren oder auf Rosylin.

Ah - vlt. musst du einen TypeConverter coden, der String nach PropertyInfo konvertiert, und der kann auch Exceptions-schmeißen, und dann müsste das Xaml dann auch meckern.
Den TypConverter müssteste dann an deine Control-Property dran-attributieren, glaubich.
Also ich hab sowas schoma gebastelt, quasi eine eigene Syntax, wie man GridColumns/Rows definieren konnte (weil das Standard-Heckmeck damit geht mir auf die Nerven), das Prinzip müsste hier auch möglich sein.

Der frühe Apfel fängt den Wurm.

P
157 Beiträge seit 2014
vor 8 Jahren

Das wird so nicht funktionieren, die Eigenschaft gegen die du reflektierst, ist vom Typ Type und entsprechend wirst du nur Eigschaften der Klasse Type bekommen.

Dafür gibt es Generics, die werden aber von WPF nicht wirklich unterstützt...leider...Ich vermisse es auch manchmal.

Wenn's zum weinen nicht reicht, lach drüber!

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 8 Jahren

Generic gibt es:
https://msdn.microsoft.com/de-de/library/ee956431%28v=vs.110%29.aspx
Ich habe es allerdings noch nie ausprobiert

Allerdings meine ich das nicht
Ich meine, dass ich als Property-Wert einer beliebigen Property eines an anderer Stelle angegeben Types durch IntelliSense unterstützt angeben und validieren kann.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.