c# - WPF Tab Control Prevent Tab Change -


i'm trying develop system maintenance screen application in have several tabs each representing different maintenance option i.e. maintain system users et cetera. once user clicks on edit/new change existing record want prevent navigating away current tab until user either clicks save or cancel.

after googling i've found link http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/ seemed solve problem, or thought.

i've tried implementing this, event never seems fire. below xaml.

<tabcontrol name="tabcontrol">     <tabitem header="users">         <dockpanel>             <groupbox header="existing users" name="groupbox1" dockpanel.dock="top" height="50">                 <stackpanel orientation="horizontal">                     <label margin="3,3,0,0">user:</label>                     <combobox width="100"  height="21" margin="3,3,0,0"></combobox>                     <button width="50" height="21" margin="3,3,0,0" name="btnusersedit" click="btnusersedit_click">edit</button>                     <button width="50" height="21" margin="3,3,0,0" name="btnusersnew" click="btnusersnew_click">new</button>                 </stackpanel>             </groupbox>             <groupbox header="user information" name="groupbox2">                 <button content="cancel" height="21" name="btncancel" width="50" click="btncancel_click" />             </groupbox>         </dockpanel>     </tabitem>     <tabitem header="user groups">      </tabitem>         </tabcontrol> 

and code

public partial class systemmaintenancewindow : window {      private enum teditmode { emedit, emnew, embrowse }      private teditmode _editmode = teditmode.embrowse;              private teditmode editmode     {         { return _editmode; }         set          {              _editmode = value;          }     }              public systemmaintenancewindow()     {         initializecomponent();          var view = collectionviewsource.getdefaultview(tabcontrol.items.sourcecollection);         view.currentchanging += this.items_currentchanging;     }              void items_currentchanging(object sender, currentchangingeventargs e)     {         if ((e.iscancelable) && (editmode != teditmode.embrowse))         {             var item = ((icollectionview)sender).currentitem;             e.cancel = true;             tabcontrol.selecteditem = item;              messagebox.show("please save or cancel work first.", "error", messageboxbutton.ok, messageboximage.error);         }     }              private void btnusersnew_click(object sender, routedeventargs e)     {         editmode = teditmode.emnew;     }      private void btnusersedit_click(object sender, routedeventargs e)     {         editmode = teditmode.emedit;     }      private void btncancel_click(object sender, routedeventargs e)     {         editmode = teditmode.embrowse;     } } 

apologies if i'm being stupid, life of me cannot workout see why event not fire when user clicks between tabs.

thanks help.

emlyn

i've come solution suits needs. seems backwards compared other options i'm found seems nice , neat.

basically i'm keep private variable of current tabindex , on "selectionchanged" event of tabcontrol i'm doing checks , set tabcontrol.selectedindex value if user not in browse mode.

private void tabcontrol_selectionchanged(object sender, system.windows.controls.selectionchangedeventargs e)     {         if (e.originalsource == tabcontrol)         {             if (editmode == teditmode.embrowse)             {                 _tabitemindex = tabcontrol.selectedindex;             }             else if (tabcontrol.selectedindex != _tabitemindex)              {                 e.handled = true;                  tabcontrol.selectedindex = _tabitemindex;                  messagebox.show("please save or cancel work first.", "error", messageboxbutton.ok, messageboximage.error);             }          }     } 

Comments

Popular posts from this blog

linux - Mailx and Gmail nss config dir -

c# - Is it possible to remove an existing registration from Autofac container builder? -

php - Mysql PK and FK char(36) vs int(10) -