Laden...

[gelöst] Probleme beim DataBinding in Resourcen

Letzter Beitrag vor 14 Jahren 3 Posts 1.167 Views
[gelöst] Probleme beim DataBinding in Resourcen

Sers zusammen,

ich habe ein TreeView dessen TreeViewItems über ein DataTemplate designt werden. Die Objekte die jeweils dahinter liegen haben eine Eigenschaft Type.

Jetzt möchte ich ein Kontextmenü einsetzen, das bestimmte MenuItems entsprechend diesem Type enabled oder disabled, je nachdem welches TreeViewItem ausgewählt ist. Das Kontextmenü habe ich in den TreeView.Resources angelegt:


<ContextMenu x:Key="ItmContextMenu" MinWidth="150" >
  <MenuItem Header="foobar" IsEnabled="{Binding ElementName=trvTree, Path=SelectedItem, Converter={StaticResource SpecificConverterForNodes}}"/>
</ContextMenu>

Die Convert-Routine des Converters:


public object Convert(object value, [...])
{
  ModelNode node = value as ModelNode;
  return node.Type == NodeType.Foo;
}

(ConvertBack verwende ich nicht.)

Der Converter wird dummerweiße garnicht erst aufgerufen, und foobar-MenuItem wird nicht disabled oder enabled - warum? Ich habe alternativ versucht das ContextMenu in den Window.Resources abzulegen, ohne erfolg. Ich habe Spaßeshalber ein Button.IsEnabled nach gleicher Weise gebunden, da hats geklappt, aber warum nich im ContextMenu bzw. beim MenuItem?

Danke,
DiscMaster

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

Das ContextMenu ist nicht im selben Visual Tree, ich vermute er kann das Binding nicht auflösen.
Google einfach nach "ContextMenu Binding".

Vorher schau in den VS Output, da steht wenn ein Binding nicht funktioniert.

Sers,

Google einfach nach "ContextMenu Binding".

Darauf hätt ich auch so kommen können, aber mancher Tritt tut eben not, insofern Danke 😃

Das Problem ist der NameScope, den man aber ändern kann (im Konstruktor, nach dem InitializeComponent()). Man holt sich zunächst die Resource und ändert dann ihren namescope:


ContextMenu cxt = (ContextMenu)this.FindResource("myContextMenu");
NameScope.SetNameScope(cxt, NameScope.GetNameScope(this));

Quelle:stackoverflow.com

DiscMaster

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg