Inline editing TextBlock in a ListBox with Data Template (WPF)

前端 未结 4 808
耶瑟儿~
耶瑟儿~ 2020-12-13 16:39

Using WPF, I have a ListBox control with a DataTemplate inside it. The relevant XAML code is shown below:



        
4条回答
  •  遥遥无期
    2020-12-13 16:56

    What I've done in these situations is used the XAML hierarchy to determine which element to show/hide. Something along the lines of:

    
      
      
    
    

    with the code:

    protected void txtblk_MouseDown(object sender, MouseButtonEventArgs e)
    {
        TextBox txt = (TextBox)((Grid)((TextBlock)sender).Parent).Children[1];
        txt.Visibility = Visibility.Visible;
        ((TextBlock)sender).Visibility = Visibility.Collapsed;
    }
    
    protected void txtbox_LostFocus(object sender, RoutedEventArgs e)
    {
        TextBlock tb = (TextBlock)((Grid)((TextBox)sender).Parent).Children[0];
        tb.Text = ((TextBox)sender).Text;
        tb.Visibility = Visibility.Visible;
        ((TextBox)sender).Visibility = Visibility.Collapsed;
    }
    

    I always turn stuff like this that I'm going to reuse into a UserControl, which I can add additional error handling to, and guarantee that the Grid will only contain two items, and the order of them will never change.

    EDIT: Additionally, turning this into a UserControl allows you to create a Text property for each instantiation, so you can name each one and reference the text directly without fishing for the current value through the ((TextBox)myGrid.Children[1]).Text casting. This will make your code much more efficient and clean. If you make it into a UserControl, you can also name the TextBlock and TextBox elements, so no casting is needed at all.

提交回复
热议问题