如何将文本框中的字符串添加到另一个窗口中的列表视图

Posted

技术标签:

【中文标题】如何将文本框中的字符串添加到另一个窗口中的列表视图【英文标题】:How to add a string from a textbox to a listview in another window 【发布时间】:2020-09-14 13:07:44 【问题描述】:

我正在尝试在主窗口中创建一个列表视图,如果用户想要添加一个项目,他首先需要打开一个菜单窗口。从那个窗口,他进入一个带有文本框的窗口。单击按钮后,键入到文本框中的字符串应添加到列表视图中。我遇到的问题是我无法将字符串发送到 mainWindow,因为文本框窗口中的方法需要是非静态的才能读取文本框的内容。因此,我无法将文本框的字符串从主窗口添加到 ListView。

我已经了解了如何将字符串发送到 mainWindow 而不使其成为静态的。我试过了:

MainWindow newWnd = new MainWindow();
newWnd.Show();

这确实使文本框中的文本出现在 ListView 中,但在向 ListView 添加另一个项目时,第一个项目会消失。我可以创建一种将以前的项目添加到新窗口的方法,但这只会在一定程度上起作用。我不想每次用户将项目添加到 ListView 时都需要打开一个新窗口。我想从原始主窗口向 ListView 添加一个项目。

我的代码:

主窗口: XAML:

<ListView Name="ingredientsList"/>

<Button Content="Add +" Click="Button_Click"/>

.cs:

public void Button_Click(object sender, RoutedEventArgs e)
        
            //Opens the menu window
            Menu popup = new Menu();
            popup.ShowDialog();
        

        public void AddIngredient(string e)
        
            ingredientsList.Items.Add(e);
        

菜单窗口打开文本框窗口(无需代码)

文本框窗口: XAML:

<TextBox x:Name="Ingredient"/>
<Button Content="Add" Click="Add_Click"/>
<Button Content="Cancel" Height="25" Width="70" Margin="125,150,0,0" Click="Cancel_Click" IsCancel="True"/>

.cs:

 public void Add_Click()
        

            Window.AddIngredient(Ingredient.Text);

        

        private void Cancel_Click(object sender, RoutedEventArgs e)
        
            this.Close();
        

【问题讨论】:

每次添加项目时,您都在创建主窗口的新实例?您应该保留该实例并重新使用它。 @Bizhan 你能解释一下你的意思以及我该怎么做吗? 我认为这是不言自明的,您正在更新您之后丢弃的窗口实例的属性。将该对象保存在内存中,这样添加的项目就不会丢失。通过保存在内存中,我的意思是创建一个主窗口变量并只实例化一次而不是每次。 【参考方案1】:

您应该使用数据绑定将TextBox 输入存储在对话框的属性中,例如Ingredient。单击添加按钮后,将此项目添加到对话框的公共集合中,例如Menu.NewIngredients,并清除TextBox。 对话框关闭后,您可以使用数据绑定将Menu.NewIngredients 的新项目添加到ListView

*Menu.xaml.cs**

partial class Menu : Window

  public static readonly DependencyProperty IngredientProperty = DependencyProperty.Register(
    "Ingredient",
    typeof(string),
    typeof(MainWindow),
    new PropertyMetadata("Boom"));

  public string Ingredient
  
    get => (string)GetValue(MainWindow.IngredientProperty);
    set => SetValue(MainWindow.IngredientProperty, value);
  

  public List<string> NewIngredients  get; set; 

  public Menu()
  
    this.NewIngredients = new List<string>();
  

  public void Add_Click(object sender, RoutedEventArgs e)
  
    this.NewIngredients.Add(this.Ingredient);
    this.Ingredient = string.Empty;
  

  private void Cancel_Click(object sender, RoutedEventArgs e)
  
    this.Close();
  

Menu.xaml

<Window x:Name="Window">
  <StackPanel>
    <TextBox Text="Binding ElementName=Window, Path=Ingredient" />
    <Button Content="Add" Click="Add_Click"/>
    <Button Content="Cancel" Click="Cancel_Click" IsCancel="True"/>
  </StackPanel>
</Window>

MainWindow.xaml.cs

partial class MainWindow : Window

  public static readonly DependencyProperty IngredientsProperty = DependencyProperty.Register(
    "Ingredients",
    typeof(ObservableCollection<string>),
    typeof(MainWindow),
    new PropertyMetadata(default(ObservableCollection<string>)));

  public ObservableCollection<string> Ingredients
  
    get => (ObservableCollection<string>) GetValue(MainWindow.ResultsProperty);
    set => SetValue(MainWindow.ResultsProperty, value);
  

  public MainWindow()
  
    this.Ingredients = new ObservableCollection<string>();
  

  public void Button_Click(object sender, RoutedEventArgs e)
  
    // Opens the menu window
    Menu popup = new Menu();
    popup.ShowDialog();

    popup.NewIngredients.Foreach(this.Ingredients.Add);
  

MainWindow.xaml

<Window x:Name="Window">
  <StackPanel>
    <ListView ItemsSource="Binding ElementName=Window, Path=Ingredients" />
    <Button Content="Add +" Click="Button_Click"/>
  </StackPanel>
</Window>

【讨论】:

以上是关于如何将文本框中的字符串添加到另一个窗口中的列表视图的主要内容,如果未能解决你的问题,请参考以下文章

从其他窗口将新项目添加到列表框

Python如何将列表中的元素添加到另一个字符串列表中

mfc如何将一个编辑框中的数字追加到另一个编辑框,不是覆盖,而是接在原来的后面显示?

将项目添加到另一个活动中的列表视图(仅添加 1 个条目)

如何将组合框中的 SelectedIndex 连接到列表连接字符串?

如何检测表视图中的项目何时更改?