拖放更多的文本框

时间:2014-01-05 18:55:28

标签: c# wpf mvvm

在下面的代码我有2个文本框的列表框,目前它的工作,但我有两个问题

1.suppose我需要拖动超过2个文本框,而不是复制代码我可以写它 以动态的方式支持5个文本框?

这是两个文本框的代码

private void textbox1_PreviewDrop(object sender, DragEventArgs e)
{
    string name = e.Data.GetData(DataFormats.StringFormat).ToString();
    textbox1.Text += name;
    textbox1.Focus();
    textbox1.CaretIndex = textbox1.Text.Length;
    e.Handled = true;
    _UsersList.Remove((User) listbox1.SelectedItem);

}

private void textbox2_PreviewDrop(object sender, DragEventArgs e)
{
    string name = e.Data.GetData(DataFormats.StringFormat).ToString();
    textbox2.Text += name;
    textbox2.Focus();
    textbox2.CaretIndex = textbox2.Text.Length;
    e.Handled = true;
    bool remove = _UsersList.Remove((User)listbox1.SelectedItem);
}

以下代码中的第二个问题我检查文本框是否已经有值,如果是,则不允许拖动(文本框1和2的Or语句) 另一个值,如果我有超过2个文本框,有更好的方法来写它吗?

private void listbox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 0 && (string.IsNullOrEmpty(textbox1.Text) || string.IsNullOrEmpty(textbox2.Text)))
    {
        if (listbox1.SelectedItems.Count > 0)
        {
            var mySelectedItem = listbox1.SelectedItem as  User;

...             }         }     }

xaml中的

 <TextBox x:Name="textbox1"  
                  AcceptsReturn="True"
                  AllowDrop="True" 
                  DragOver="textbox1_DragOver"
                  PreviewDrop="textbox1_PreviewDrop" 

      <TextBox x:Name="textbox2"  
                  AcceptsReturn="True"
                  AllowDrop="True" 
                  DragOver="textbox2_DragOver"
                  PreviewDrop="textbox2_PreviewDrop" 

2 个答案:

答案 0 :(得分:1)

问题1:是的,您可以创建一个通用方法并传入参数。像这样:

    private void textbox_PreviewDrop(object sender, DragEventArgs e)
    {
       string name = e.Data.GetData(DataFormats.StringFormat).ToString();

        TextBox textbox = (TextBox)sender;
        textbox.Text += name;
        textbox.Focus();
        textbox.CaretIndex = textbox.Text.Length;
        e.Handled = true;
        bool remove = _UsersList.Remove((User)listbox1.SelectedItem);
    }

   <TextBox x:Name="textbox1"  
              AcceptsReturn="True"
              AllowDrop="True" 
              DragOver="textbox1_DragOver"
              PreviewDrop="textbox_PreviewDrop" 

  <TextBox x:Name="textbox2"  
              AcceptsReturn="True"
              AllowDrop="True" 
              DragOver="textbox2_DragOver"
              PreviewDrop="textbox_PreviewDrop" 

问题2:您的代码看起来正确。您必须为每个文本框检查Null / Empty。我没有看到更好的方法。

答案 1 :(得分:1)

为所有textBox提供 一个公共处理程序 。您可以从发件人获取textBox:

private void textbox_PreviewDrop(object sender, DragEventArgs e)
{
    TextBox textBox = (TextBox)sender;
    string name = e.Data.GetData(DataFormats.StringFormat).ToString();
    textBox.Text += name;
    textBox.Focus();
    textBox.CaretIndex = textBox.Text.Length;
    e.Handled = true;
    bool remove = _UsersList.Remove((User)listbox1.SelectedItem);
}