WPF - 如何从子窗口到父窗口获取值

时间:2015-12-05 18:40:21

标签: c# .net wpf

我有2个窗口父窗口 - Window_Products和子窗口 - Window_NewProduct

1)在我的Window_Products中

  • 我在此窗口中有一个列表ObservableCollection ProductsList,它显示了产品列表
  • AddNewProduct()用于将新产品从子窗口添加到列表中

    public AddNewProduct()
    {
         Window_NewProduct  newProduct = new Window_NewProduct();
         if(newProduct.ShowDialog() = true)
         {
               ProductsList.Add(//what code should I write here);
          }
     }
    

2)在我的Window_NewProduct

  • 此窗口使用用户控件ProductUserControl,因为我将用户控件用作Page以及Window

    <Window>
           <local:ProductUserControl x:Name="ProductUserControl">
     </Window>
    

3)在我的产品用户控件

public ProductUserControl()
{
        this.DataContext = new ProductViewModel();
}

4)在我的ProductViewModel

  • 我有这个对象产品,它存储像Prod_Name,Prod_Code这样的值。
  • 我想要的是此对象将产品保存到数据库后,将产品返回到父窗口(Window_Products),以便我可以将新产品添加到上面的可观察集合中。
  • 我的对象如何通过usercontrol,子窗口从视图模型返回,然后到达父窗口。

帮助我解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:0)

为indow_NewProduct创建一个新的构造函数:

Activity

在你的例子中: 1)在我的Window_Products中:

public ProductUserControl(ProductViewModel model):base()
{
    this.DataContext = model;
}

有几件事: 这不好,但它可能符合你的需要: 2.看看MVVM和MVC,将它们结合起来也有控制器。 3.在WPF中,您应该尽可能多地使用DataContext来移动数据,这个NewProduct可能是prant的窗口数据上下文的一部分。

答案 1 :(得分:0)

为您的用户控件添加依赖项属性,并将其绑定到xaml中的依赖项属性,如下所示。

public static readonly DependencyProperty ProductProperty = DependencyProperty.Register(
    "Product", typeof(ProductDto), typeof(ProductUserControl), new FrameworkPropertyMetadata(null));

public ProductDto Product
{
    get { return (ProductDto)this.GetValue(ProductProperty); }
    set { this.SetValue(ProductProperty, value); }
}

<TextBox Margin="2" Text="{Binding Path=Product.Code, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Margin="2" Text="{Binding Path=Product.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

您应该拥有Window_NewProduct的视图模型的产品属性

public class Window_NewProductViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private ProductDto product;

    public ProductDto Product
    {
        get 
        {
            return this.product; 
        }
        set 
        { 
            if (value != this.product)
            {
                this.product = value;
                NotifyPropertyChanged();
            }
        } 
    }
}

然后在Window_NewProduct xaml中,您应该将此属性绑定到usercontrols依赖项属性

<local:ProductUserControl x:Name="ProductUserControl" Product="{Binding Product}"/>

将参数添加到Window_NewProduct构造函数中,该构造函数接收ProductDto并将其传递给ViewModel。

public Window_NewProduct(ProductDto product)
{
    InitializeComponent();

    this.DataContext = new Window_NewProductViewModel() { Product = product };
}

然后在您的MainWindow中,您可以创建一个新的productDto以传递给DetailsWindow。

var newProduct = new ProductDto();

var window_NewProduct = new Window_NewProduct(newProduct);

if (window_NewProduct.ShowDialog() == true)
{
    Debug.WriteLine(newProduct.Code);
    Debug.WriteLine(newProduct.Name);
}