在父窗口列表框中添加项目?

时间:2012-04-02 18:34:47

标签: wpf xaml listbox window

几乎一切都在问题标题中说。我在一个窗口中有动物列表框,按钮“添加新动物”。当我点击该按钮时,会出现一个新窗口,我将在其中输入动物的必要日期,在“保存动物”按钮上,我想将该动物添加到第一个窗口的列表框中。

<Window x:Class="HelloZooWPF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:model="clr-namespace:HelloZoo.Model;assembly=HelloZoo.Model"
    xmlns:helloZooWpf="clr-namespace:HelloZooWPF"
    Title="Hello Zoo Wpf"
    Height="500"
    Width="525">
  <Window.DataContext>
    <model:Zoo Name="Belgrade Zoo">
        <model:Zoo.Animals>
            <model:Lion Name="Zeus" Weight="900" ImagePath="pack://application:,,,/Images/Lion.jpg"/>
            <model:Lion Name="Simba" Weight="200" ImagePath="pack://application:,,,/Images/Lion.jpg"/>
            <model:Antelope Name="Daisy" Weight="200" ImagePath="pack://application:,,,/Images/antelope.jpg"/>
            <model:Antelope Name="Rosie" Weight="200" ImagePath="pack://application:,,,/Images/antelope.jpg"/>
            <model:Antelope Name="Goldie" Weight="200" ImagePath="pack://application:,,,/Images/antelope.jpg"/>
        </model:Zoo.Animals>
    </model:Zoo>
  </Window.DataContext>
  <Grid>
    <ListBox ItemsSource="{Binding Path=Animals}" Grid.Row="2" AlternationCount="2"/>
    <Button Content="New animal" Click="Button_Click"/>
  </Grid>
</Window>

没有复制所有的xaml代码,比如Grid.RowDefinitions和Grid.ColumnDefinitions。在Button_Click上我只说NewAnimalWindow n = new NewAnimalWindow(); n.ShowDialog();

NewAnimalWindow只有两个名称和重量的文本框,动物类型的组合框和按钮“保存动物”,我想在父窗口中将动物添加到动物的集合中。

2 个答案:

答案 0 :(得分:0)

最简单的实现案例是在NewAnimalWindow中定义自定义构造函数并在那里传递AnimalsList:

public class NewAnimalWindow : ...
{
    private List<Animal> _animals;
    public NewAnimalWindow(List<Animal> animals)
    {
        _animals = animals;
    }

    ....

    public SaveButton_Click(...)
    {
        Animal animal = new Animal(name, weight);
       _animals.Add(animal);
    }
}

其他选项包括:

  1. 在应用程序中的某处使用全局动物列表
  2. 使用AddAnimal(animal)等方法发送一些回发界面而不是动物列表,点击保存按钮后会调用
  3. 在NewAnimalWindow中创建一个事件,该事件将在保存按钮单击时触发。
  4. 很多其他人,可能。

答案 1 :(得分:0)

我会在NewAnimalWindow上找一个属性,它允许访问创建的对象。

<强>主窗口

var animalWindow = new NewAnimalWindow();
animalWindow.ShowDialog();

if (animalWindow.DialogResult.HasValue && animalWindow.DialogResult.Value)
{
    var createdAnimal = animalWindow.CreatedAnimal;
    Animals.Add(createdAnimal);
}

<强> NewAnimalWindow

  <Button IsDefault="True" Click="Button_OK_Click">Close</Button>
  <Button IsCancel="True">Cancel</Button>

private Animal _animal;

public Animal CreatedAnimal
{
  get
  {
    return _animal;
  }
}

private void Button_OK_Click(object sender, RoutedEventArgs e)
{
  DialogResult = true;
}

或者,如果您正在使用ViewModels,则可以在创建动物时使用Mediator模式并触发事件,因此主视图模型可以将其添加到列表中。