【问题标题】:WPF Textbox to ListBoxItem BindingWPF 文本框到 ListBoxItem 绑定
【发布时间】:2020-07-23 15:00:36
【问题描述】:

您好,我是 WPF 新手,我需要将文本框文本绑定到列表框项。

这是我的 XAML 代码: 我的 XAML 代码有 3 列。

  1. 第一列有一个按钮,当用户双击鼠标时,该按钮会自动生成文本框。
  2. 第二列就像画布显示文本框
  3. 第三列是列表框。

当用户点击stackpanel1中的按钮时,Textbox自动生成到Second_Stackpanel中。然后,用户在文本框中输入文本,该文本会自动绑定到 listboxitem(stackpanel3)。(用户将相同的文本更改为文本框,在该文本中也会更新相同的 listboxitem 索引。)

用户再次点击按钮自动生成另一个文本框,该文本绑定到下一个索引中的 listboxitem...

如何在 wpf 中将文本框绑定到 ListboxItems 请帮助我

我在 google 和 stackoverflow 网站上找到(列表框到文本框仅在此处绑定)。但我需要将文本框绑定到列表框。


<Window x:Class="WpfApp5.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:local="clr-namespace:WpfApp5"
     xmlns:syncfusion="http://schemas.syncfusion.com/wpf"
     xmlns:Control="clr-namespace:Syncfusion.Windows.Tools.Controls;assembly=Syncfusion.Tools.Wpf"
     mc:Ignorable="d"
     Title="MainWindow" Height="450" Width="800">
 <Grid>
     <Grid.ColumnDefinitions>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
         <ColumnDefinition></ColumnDefinition>
     </Grid.ColumnDefinitions>
     <StackPanel Grid.Column="0" Background="LightCoral" x:Name="stackpanel1">
         <Button Height="40" Width="60" Content="Text" Background="Black" Foreground="Red"
                 HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20" FontSize="20"
                 MouseDoubleClick="TextBox_DynamicallyGenerated_Mouse_DoubleClick"></Button>
     </StackPanel>
     <StackPanel Grid.Column="1" Background="White" x:Name="stackpanel2">
     </StackPanel>
     <StackPanel Grid.Column="2" Background="Gray" x:Name="stackpanel3">
         <ListBox Height="300" x:Name="lstboxitems" Background="Aquamarine" Margin="20"></ListBox>
     </StackPanel>
     
 </Grid>
</Window>

这是我的代码隐藏

public partial class MainWindow : Window
    {
        public static TextBox textBox;
       
        public MainWindow()
        {
            InitializeComponent();
        }

       
        
        private void TextBox_DynamicallyGenerated_Mouse_DoubleClick(object sender, MouseButtonEventArgs e)
        {
            textBox = new TextBox();
            textBox.Text = "Enter Text Here";
            textBox.Width = 120;
            textBox.Height = 25;
            textBox.Background = Brushes.White;
            textBox.BorderBrush = Brushes.Red;
            textBox.Name = "txtbox";
            textBox.IsEnabled = false;
            textBox.Foreground = Brushes.Red;
            stackpanel2.Children.Add(textBox);
            Canvas.SetLeft(textBox, e.GetPosition(stackpanel2).X);
            Canvas.SetTop(textBox, e.GetPosition(stackpanel2).Y);
            textBox.MouseDoubleClick += TextBox_MouseDoubleClick;
        }

        private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            textBox = sender as TextBox;
            textBox.IsEnabled = true;
            textBox.MouseLeave += TextBox_MouseLeave;
        }

        private void TextBox_MouseLeave(object sender, MouseEventArgs e)
        {
            textBox = sender as TextBox;
            textBox.IsEnabled = false;
        }
    }

【问题讨论】:

  • 您好,您必须在创建文本框时在代码隐藏中声明绑定。您是否有特定的原因要这样做,而不是将文本框放在 ListItem 中,以便您可以直接编辑它们?
  • 我需要像绘画应用一样设计。用户在画布页面中拖放对象。然后用户在画布中生成文本并编辑文本。在列表框中显示。当用户编辑 textbox.text 列表框项目时也会自动更新

标签: wpf data-binding listboxitem


【解决方案1】:

您可以在创建文本框时在后面的代码中设置绑定。

TextBlock lisboxItemTxtBlock = new TextBlock();
this.lstboxitems.Items.Add(new ListBoxItem { Content = lisboxItemTxtBlock });
Binding binding = new Binding("Text");
binding.Source = textBox;
BindingOperations.SetBinding(lisboxItemTxtBlock, TextBlock.TextProperty, binding);

我有几句话可能会有所帮助:

  1. 在您发布的代码中,您将 TextBox 的名称设置为“txtbox”,而您可能希望生成一个唯一名称并对其进行跟踪,以便以后进行其他修改。

  2. 您将 textBox 的 IsEnabled 属性设置为 false,并在 MouseDoubleClick 上添加一个事件。这不起作用,该事件不会在未启用的文本框上触发。你可以看看:Disable a WPF button, but still swallow the click events

  3. 虽然这是我找到的回答问题的最佳方式,但请注意,这样做对 MVVM 不友好,因此您可能需要在做出决定之前检查 WPF 的 MVVM 模式。

【讨论】:

  • 好的。谢谢 Ostas,我会试试这个并检查 WPF 的 MVVM 模式
  • 没问题,如果对您有帮助,请将答案标记为已接受的答案,以便有相同问题的人可以看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 2011-07-17
  • 2012-11-23
  • 2012-11-24
  • 2015-12-30
  • 2011-09-22
  • 2015-10-16
相关资源
最近更新 更多