Как добавить строку из текстового поля в список в другом окне - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать список в mainWindow, и если пользователь хочет добавить элемент, ему сначала нужно открыть окно меню. Из этого окна он переходит в окно с текстовым полем. После нажатия кнопки строка, введенная в текстовое поле, должна быть добавлена ​​в список. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу отправить строку в mainWindow, потому что метод в окне текстового поля должен быть нестатическим c, чтобы он мог прочитать содержимое текстового поля. Таким образом, я не могу добавить строку из текстового поля в ListView из mainWindow.

Я рассмотрел, как отправить строку в mainWindow, не делая ее stati c. Я пробовал:

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

Это заставляет текст из текстового поля появляться в ListView, но при добавлении другого элемента в ListView первый исчезает. Я мог бы создать способ добавления предыдущих элементов в новое окно, но это будет работать только до определенной степени. Я не хочу открывать новое окно каждый раз, когда пользователь добавляет элемент в ListView. Я хочу добавить элемент в ListView из исходного mainWindow.

Мой код:

MainWindow: 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();
        }

1 Ответ

0 голосов
/ 27 мая 2020

Вы должны использовать привязку данных для сохранения ввода TextBox в свойстве диалога, например, Ingredient. При нажатии кнопки Добавить добавьте этот элемент в коллекцию publi c вашего диалога, например, 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...