Laden...

[gelöst] Probleme beim DataBinding in Resourcen

Erstellt von DiscMaster vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.160 Views
DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 13 Jahren
[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

U
1.578 Beiträge seit 2009
vor 13 Jahren

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.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 13 Jahren

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