wpf - How to hide the Separator in a context menu using MultiBinding? -
i using context menu on wpf treeview , pretty there want. before explain problem let me explain xaml definition context menu doing.
for each menu item in context menu have command either disables or enables menu item based on commands canexecute method. each command set isenabled property of corresponding menu item depending on result of canexecute.
isenabled each menu item bound booleantovisibilityconverter converts the isenabled bool value collapse or visible value bound visibility propery of menu item. again works fine , menu items displaying , hiding fine.
now problem. in xaml below have 2 menu items(addcategorymenuitem , removecategorymenuitem) above separator. trying multibinding isenabled property of these 2 menu items via custom implementation of imultivalueconverter (multibooleantovisibilityconverter) when 2 menu items disabled can set visibility property of separator collapsed , hence hide separator when menu items disabled.
for convert method in converter(multibooleantovisibilityconverter) parameter value (object [] values) 2 items in array hold value "{dependencyproperty.unsetvalue}". these cannot cast boolean values , hence visibility value cannot worked out.
maybe has elementname used in multibinding. can not find element? have tried using relativesource i.e find ancestor etc. got confused. have spent hours on leave community.
kind regards
mohammad
<contextmenu x:key="categorymenu"> <contextmenu.itemcontainerstyle> <style targettype="{x:type control}"> <setter property="visibility" value="{binding path=isenabled, relativesource={relativesource self}, mode=oneway, converter={staticresource booleantovisibilityconverter}}" /> </style> </contextmenu.itemcontainerstyle> <contextmenu.items> <menuitem x:name="addcategorymenuitem" header="add category" command="{binding addcategory}"> <menuitem.icon> <image source="/images/add.png" width="16" height="16" /> </menuitem.icon> </menuitem> <menuitem x:name="removecategorymenuitem" header="remove category" command="{binding removecategory}"> <menuitem.icon> <image source="/images/remove.png" width="16" height="16" /> </menuitem.icon> </menuitem> <separator> <separator.visibility> <multibinding converter="{staticresource multibooleantovisibilityconverter}"> <binding mode="oneway" elementname="addcategorymenuitem" path="isenabled" /> <binding mode="oneway" elementname="removecategorymenuitem" path="isenabled" /> </multibinding> </separator.visibility> </separator> <menuitem x:name="refreshcategorymenuitem" header="refresh" command="{binding refreshcategory}"> <menuitem.icon> <image source="/images/refresh.png" width="16" height="16" /> </menuitem.icon> </menuitem> </contextmenu.items> </contextmenu>
ok, after rest have managed solve it. had use relativesource , findancestor context menu object , access items collection , use indexer value menu item. think better if use menu item name don't magic numbers in code or indeed xaml.
<separator> <separator.visibility> <multibinding converter="{staticresource multibooleantovisibilityconverter}"> <binding mode="oneway" relativesource="{relativesource findancestor, ancestortype={x:type contextmenu}}" path="items[0].isenabled" /> <binding mode="oneway" relativesource="{relativesource findancestor, ancestortype={x:type contextmenu}}" path="items[1].isenabled" /> </multibinding> </separator.visibility> </separator>
Comments
Post a Comment