Laden...

Zuordnung eines Namespaces

Erstellt von Cuin vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.473 Views
C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren
Zuordnung eines Namespaces

Hallo,

mich beschäftigt schon seit 2 Tagen ein Problem, und zwar geht es um ein TreeView, in dem ich die Icons, je nach TreeViewItem-Typ selber einstellen möchte. (Z.b.: unterschiedliche Icons für Expanden und Collapsed).

Das klappt auch bisher ganz wunderbar. Mein Programm lässt sich auch compilieren und starten. Wenn ich jedoch das Programm schließe, oder im Designer was ändern will, dann meckert VS 2010 immer: "Das Präfix "local" kann keinem Namespace zugeordnet werden. "

In folgender Zeile tritt der Fehler auf:


<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=(local:TreeViewItemProps.TreeViewImage)}" Value="2">
    <Setter TargetName="img" Property="Source" Value="Images/FolderOpen.png" />
</DataTrigger>

Wenn ich das hier schreibe, dann tritt kein Fehler mehr auf, aber die Icons werden dann nicht mehr angezeigt:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=TreeViewImage}" Value="2">
    <Setter TargetName="img" Property="Source" Value="Images/FolderOpen.png" />
</DataTrigger>

local wurde so definiert:

xmlns:local="clr-namespace:dummyNamespace"

Die Klasse TreeViewItemProps schaut so aus (Ausschnitt):

class TreeViewItemProps
{
    static void SetTreeViewImage(DependencyObject obj, int value)
	{
        obj.SetValue(TreeViewImageProperty, value);
	}

    public static readonly DependencyProperty TreeViewImageProperty =
		DependencyProperty.RegisterAttached(
        "TreeViewImage", 
		typeof(int), 
		typeof(TreeViewItemProps), 
		new UIPropertyMetadata(1));
}

Weiß jemand, was ich falsch mache?

mfg Cuin

U
1.578 Beiträge seit 2009
vor 13 Jahren

Nö, machst bestimmt nix falsch, der Designer ist einfach der letzte Müll, lass ihn einfach zu (und stell Xaml in den Settings auf "full xaml view", dann öffnet sich das Xaml Fenster schneller).

PS. lass dein TreeViewItemProps von DependencyObject ableiten.

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

Ja, den würde ich auch gerne zulassen, aber ab und zu braucht man den dann doch noch. Und da das meine erste WPF-Anwendung ist, kann man nicht ausschließen, dass ich irgendwo einen Fehler drin habe 😉

Wieso lässt sich die Anwendung überhaupt compilieren, wenn ich "Path=TreeViewImage" anstatt Path=(local:TreeViewItemProps.TreeViewImage)" schreibe?

In diesem Beispiel wird das etwas anders gemacht als ich es mache:

How to show different text based on an enum value?

Kann es sein, dass ich, wie in dem Beispiel, einen Setter und getter benötige??

[EDIT]Hab ich grade gemacht: Hat leider nix geändert.

mfg Cuin

5.658 Beiträge seit 2006
vor 13 Jahren

Wieso lässt sich die Anwendung überhaupt compilieren, wenn ich "Path=TreeViewImage" anstatt Path=(local:TreeViewItemProps.TreeViewImage)" schreibe?

Weil das DataBinding während der Laufzeit passiert. Die Fehler werden nicht als Compilerfehler ausgegeben, sondern stehen (zur Laufzeit) im Ausgabefenster.

Weeks of programming can save you hours of planning

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

So was ähnliches wollte ich auch gerade posten^^

Mit "Path=TreeViewImage" lässt sich die Anwendung zwar starten, aber im Ausgabefenster kommen derartige Meldungen:

System.Windows.Data Error: 40 : BindingExpression path error: 'TreeViewImage' property not found on 'object' ''TreeViewItem' (Name='')'. BindingExpression:Path=TreeViewImage; DataItem='TreeViewItem' (Name=''); target element is 'ContentPresenter' (Name='PART_Header'); target property is 'NoTarget' (type 'Object')

Vllt könnt ihr damit ja was anfangen... offensichtlich findet er hier etwas nicht...

mfg Cuin

[Edit]Mit Path=(local:TreeViewItemProps.TreeViewImage)" kommen aber keine Fehler zur laufzeit... da funktioniert ja auch alles so wie es soll... oO?

U
1.578 Beiträge seit 2009
vor 13 Jahren
'TreeViewImage' property not found on 'object' ''TreeViewItem'

<< Sagt eigentlich alles 😉
Wo ist dein "TreeViewItemProps" innerhalb der TreeViewItems definiert? Im DataContext?

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

Ich habe grade eben nochmal die Seite gefunden, von der ich mehr oder weniger abgeschrieben habe:

http://joshsmithonwpf.wordpress.com/2007/11/09/reaction-to-a-simple-wpf-explorer-tree/

Also bis auf die Namen, habe ich soweit fast alles übernommen.

TreeViewItemsProps ist eine Klasse die die DependencyProperty TreeViewImageProperty enthält. Und in dieser ist TreeViewImage definiert?

Ich seh grade den Wald vor lauter Bäumen nicht^^

mfg Cuin

U
1.578 Beiträge seit 2009
vor 13 Jahren

Ich seh jetzt erst, TreeViewItemsProps beinhaltet ein Attached property, ich hätte mal genauer lesen sollen.

Auf jeden fall sucht er das TreeViewImage im TreeViewItem.
Aber er muss das TreeViewItemsProps.TreeViewImage im TreeViewItem suchen, da es ein attached ist und kein eigenes Property.

"Path=(local:TreeViewItemProps.TreeViewImage)" ist also die korrekte schreibweise 🙂

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

Also ich versteh die Welt nichtmehr...

ich habe jetzt einfach die ganzen Methoden wie in dem vorhin genannten Beispiel umbenannt und auf einmal funktioniert das ganze... Kann es sein, dass IsRootLevel oder IsRootLevelProperty irgendetwas vordefiniertes ist? Oder das vllt TreeViewImage was vordefiniertes ist??

Hier mein jetztiger Code:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=(local:TreeViewItemProps.IsRootLevel)}" Value="0">
    <Setter TargetName="img" Property="Source" Value="Images/FolderClosed.png" />
</DataTrigger>

Und die DependencyProperty:

public static readonly DependencyProperty IsRootLevelProperty =
    DependencyProperty.RegisterAttached(
    "IsRootLevel",
    typeof(int),
    typeof(TreeViewItemProps),
    new UIPropertyMetadata(0));

Also ich habe wirklich nix anderes gemacht, als die Dinger umzubennen...
Als [gelöst] kann man den Thread aber leider trotzdem nicht setzen, da ich immer noch nicht weiß, was mein Fehler war... naja, hauptsache das ding funktioniert jetzt^^
Vielen Dank für eure Hilfe!!

mfg Cuin

U
1.578 Beiträge seit 2009
vor 13 Jahren

Deine int values sind anders, vorher hattest du immer 1 als standard und auf 0 gefragt, jetzt hast du 0 als standard und fragst auch auf 0.
Eventuell funktionerte es bereits nur Value="0" traf einfach nie zu 😁

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

Nene^^ Ich habe das ganze quasi von vorn gemacht. Also die Methoden etc. von dem vorhin genannten Beispiel in mein Code kopiert und passend gemacht und getestet. Und danach NUR die Namen geändert und wieder getestet und dann aufeinmal funktionierte das ganze nicht mehr...

Und Triggern tu ich auf die Werte 0,1 und 2. =) Außerdem hat das ganze ja schon 100% funktioniert... bloss nach dem schließen des Programmes hat VS rumgemeckert, das "local" keinem Namespace zugeordnet werden kann...

Eine letzte Frage habe ich aber noch zu diesem Thema:

Meine Klasse TreeViewItemProps ist jetzt von DependencyObject abgeleitet. Sollte ich meine "static void FolderExpanded(object sender, RoutedEventArgs e)"-Methoden in eine andere Klasse setzen oder ist das egal? Weil die sich gegenwärtig immer noch in TreeViewItemProps befinden...

mfg Cuin

U
1.578 Beiträge seit 2009
vor 13 Jahren

Hatt deine TreeViewItemProps Klasse vorher auch von DependencyObject abgeleitet?

static void FolderExpanded(object sender, RoutedEventArgs e)

Wasn das für ne Methode und was macht die?

C
Cuin Themenstarter:in
92 Beiträge seit 2010
vor 13 Jahren

Jop, hatte die Klasse von DependencyObject abgeleitet, dass hatte aber irgendwie keine Auswirkungen auf mein Programm.

Die Methode ändert einfach nur das Icon des TreeViewItem auf Expanded (Also geöffnetes Ordner-Symbol). Dann gibts noch das Pendant zu Collapsed. Ich meine damit, ob es sinnvoll ist irgendwelche Methoden in die Klasse hinzuzufügen, die irgendwie was mit dem TreeView zu tun haben, aber nicht unbedingt was mit "DependencyObjekt" zu tun.

 static void FolderExpanded(object sender, RoutedEventArgs e)
 {
     TreeViewItem item = (TreeViewItem)sender;
     SetIsRootLevel(item, TreeIcon.Open);
     e.Handled = true;
 }