之前wpf項目用到listbox右鍵編輯的功能,想到當時找資料不好找,特地將自己的結果拿出來與大家分享,探討。
首先添加一個listbox。
<ListBox x:Name="List_lianxiren" MouseDown="List_lianxiren_MouseDown" SelectionMode="Extended" Margin="15,0" />
后台代碼:
TextBox txtNode = new TextBox();
ListBoxItem selectNode = null;
string olddata;
//綁定數據到listboxitem;其中array不僅僅局限於數組,此處用數組舉例而已;
public void BindingData()
{
ListBoxItem tvi;
MenuItem menuitem;
ContextMenu contextmenu;
for (int i = 0; i < Array.Length; i++)
{
tvi = new ListBoxItem();
tvi.Content = Array[i].Owner;
tvi.Name = "_" + Array[i].id.ToString();
contextmenu = new System.Windows.Controls.ContextMenu();
menuitem = new MenuItem();
menuitem.Header = "編輯";
menuitem.Click += new RoutedEventHandler(menuitem_Click);
contextmenu.Items.Add(menuitem);
contextmenu.Width = 130;
tvi.ContextMenu = contextmenu;
tvi.GotFocus += new RoutedEventHandler(tvi_GotFocus);////
List_lianxiren.Items.Add(tvi);
}
}
//編輯框失去焦點方式一
private void List_lianxiren_MouseDown(object sender, MouseButtonEventArgs e)
{ EditNameSaveToServer(); }
//點擊編輯按鈕,變為編輯框
void menuitem_Click(object sender, RoutedEventArgs e)
{
selectNode = List_lianxiren.SelectedItem as ListBoxItem;
txtNode = new TextBox();
if (!(selectNode.Content is TextBox))
{
olddata= selectNode.Content.ToString();
txtNode.Text = selectNode.Content.ToString();
txtNode.MaxLength = 20;
txtNode.Focus();
selectNode.Content = txtNode;
}
}
//編輯框失去焦點方式二
void tvi_GotFocus(object sender, RoutedEventArgs e)
{
if (selectNode == null)
{
selectNode = sender as ListBoxItem;
txtNode = new TextBox();
txtNode.Text = selectNode.Content.ToString();
olddata= selectNode.Content.ToString();
}
EditNameSaveToServer();
}
//編輯框失去焦點后的處理事件,將數據保存到服務器什么的處理。
private void EditNameSaveToServer()
{
if (!string.IsNullOrWhiteSpace(txtNode.Text))
{
selectNode.Content = txtNode.Text;
}
else
{
selectNode.Content = olddata;
}
}