c# - SelectedItem of ContextMenu is null -


i'm trying selecteditem of contextmenu.

xaml

<window x:class="wpfapplication1.mainwindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         title="mainwindow" height="350" width="525"         datacontext="{binding relativesource={relativesource self}}">     <grid>         <stackpanel>         <listbox x:name="mylistbox" itemssource="{binding mylist}" selecteditem="{binding myselecteditem}">             <listbox.contextmenu>                 <contextmenu itemssource="{binding occontext}" previewmousedown="contextmenu_previewmousedown"/>             </listbox.contextmenu>         </listbox>         <button content="delete item" click="button_click"/>         </stackpanel>     </grid> </window> 

code behind

public partial class mainwindow : window {     public mainwindow()     {         occontext = new observablecollection<string>();         mylist = new observablecollection<string>();         mylist.add("item 1");         mylist.add("item 2");         initializecomponent();     }      public observablecollection<string> mylist { get; set; }     public observablecollection<string> occontext { get; set; }     public string myselecteditem { get; set; }      private void contextmenu_previewmousedown(object sender, mousebuttoneventargs e)     {         menubase s = sender menubase;         itemcollection ic = s.items;         string myitem = "";         myitem = (string)ic.currentitem;         mylist.add(myitem);         occontext.remove(myitem);     }      private void button_click(object sender, routedeventargs e)     {         if (myselecteditem != null)         {             occontext.add(myselecteditem);             mylist.remove(myselecteditem);         }     } } 

you can copy/paste code , program should work.

the program doing following:

you can select item in listbox. if click on "delete item", item deleted , added contextmenu. if click on contextmenu-item, item should added again listbox , removed contextmenu. should able on , on again...

so contextmenu being binded collection. item ic.currentitem. problem when delete item in listbox , add again (by clicking on item on contextmenu), ic.currentitem null.

why?

edit: solution of cyphryx working, i'm trying same using mvvm/binding:

xaml:

<contextmenu x:name="mycontext" contextmenu="{binding mycontextmenu}" itemssource="{binding occontext}"/> 

viewmodel:

    private observablecollection<string> _occontext;     public observablecollection<string> occontext     {                 {             if (_occontext == null)                 _occontext = new observablecollection<string>();             mycontextmenu.items.clear();             foreach (var str in _occontext)             {                 var item = new system.windows.controls.menuitem();                 item.header = str;                 item.click += content_mouseleftbuttonup;                 mycontextmenu.items.add(item);             }              return _occontext;         }         set         {             _occontext = value;             raisepropertychanged(() => occontext);         }     }      private void content_mouseleftbuttonup(object sender, routedeventargs e)     {         var s = sender system.windows.controls.menuitem;         if (s == null) return;         string ic = s.header.tostring();     }      private system.windows.controls.contextmenu _mycontextmenu;     public system.windows.controls.contextmenu mycontextmenu     {                 {             if (_mycontextmenu == null)                 _mycontextmenu = new system.windows.controls.contextmenu();             return _mycontextmenu;         }         set         {             _mycontextmenu = value;             raisepropertychanged(() => mycontextmenu);         }     } 

content_mouseleftbuttonup not being called?..

rudi, knowledge, cannot assign event handlers individual objects in bound source. can use wpf event handlers object tied to, hence, you'll have fill context menu manually, allowing add event handlers @ time. in short, when add previewmousedown="contextmenu_previewmousedown" wpf, handler assigned context menu, when binding adds individual menu items, not add handler each item, leaving event handless ;-) below code fix this:

wpf

<window x:class="wpfapplication1.mainwindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         title="mainwindow" height="350" width="525"         datacontext="{binding relativesource={relativesource self}}">     <grid>         <stackpanel>             <listbox x:name="mylistbox" itemssource="{binding mylist}" selecteditem="{binding myselecteditem}" height="auto" minheight="20">                 <listbox.contextmenu>                     <contextmenu name="contextmenu" opened="contextmenu_opened" />                 </listbox.contextmenu>             </listbox>             <button content="delete item" click="button_click"/>         </stackpanel>     </grid> </window> 

code behind:

public mainwindow() {     occontext = new observablecollection<string>();     mylist = new observablecollection<string>();     mylist.add("item 1");     mylist.add("item 2");     initializecomponent();  } public observablecollection<string> mylist { get; set; } public observablecollection<string> occontext { get; set; } public string myselecteditem { get; set; }  private void contextmenu_opened(object sender, eventargs e) {     contextmenu.items.clear();     foreach (var str in occontext)     {         var item = new menuitem();         item.header = str;         item.click += content_mouseleftbuttonup;         contextmenu.items.add(item);     } }  private void content_mouseleftbuttonup(object sender, eventargs e) {     var s = sender menuitem;     if (s == null) return;     var ic = s.header.tostring();      mylist.add(ic);     occontext.remove(ic); }  private void button_click(object sender, routedeventargs e) {     if (myselecteditem != null)     {         occontext.add(myselecteditem);         mylist.remove(myselecteditem);     } } 

i hope helps.

cyphryx


Comments