Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-如何从子窗口到父窗口获取值_C#_.net_Wpf - Fatal编程技术网

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

C# WPF-如何从子窗口到父窗口获取值,c#,.net,wpf,C#,.net,Wpf,我有两个windows父窗口-窗口产品和子窗口-窗口新产品 1) 在我的橱窗里 我有一个列表ObservableCollection products在此窗口中显示产品列表 AddNewProduct()用于将新产品从子窗口添加到列表中 public AddNewProduct() { Window_NewProduct newProduct = new Window_NewProduct(); if(newProduct.ShowDialog() = true)

我有两个windows父窗口-窗口产品和子窗口-窗口新产品

1) 在我的橱窗里

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

    public AddNewProduct()
    {
         Window_NewProduct  newProduct = new Window_NewProduct();
         if(newProduct.ShowDialog() = true)
         {
               ProductsList.Add(//what code should I write here);
          }
     }
    
2) 在我的橱窗里,我看到了新产品

  • 此窗口使用用户控件ProductUserControl,因为我将用户控件用作页面和窗口

    <Window>
           <local:ProductUserControl x:Name="ProductUserControl">
     </Window>
    
    4) 在我的ProductViewModel中

    • 我有一个对象产品,其中存储了Prod\u Name、Prod\u Code等值
    • 我想要的是,在我将该产品保存到数据库中之后,将该对象产品返回到父窗口(window_Products),以便我可以将新产品添加到上面的可观察集合中
    • 我的对象如何通过usercontrol、子窗口从视图模型返回,然后到达父窗口

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

    为indow_新产品创建一个新构造函数:

    public ProductUserControl(ProductViewModel model):base()
    {
        this.DataContext = model;
    }
    
    在您的示例中: 1) 在我的窗口中,您的产品变成:

    var myPVM = new ProductViewModel();
    
    Window_NewProduct  newProduct = new Window_NewProduct(myPVM);
    if(newProduct.ShowDialog() = true)
    {
       ProductsList.Add(myPVM.<THE NEW PRODUCT PROPERTY YOU WILL WRITE>);
    }
    
    var myPVM=新产品视图模型();
    窗口\新产品新产品=新窗口\新产品(myPVM);
    if(newProduct.ShowDialog()=true)
    {
    产品列表添加(myPVM.);
    }
    
    有几件事: 1.这并不好,但可能适合您的需要: 2.看看MVVM和MVC,将它们结合起来也有控制器。
    3.在WPF中,您应该尽可能多地使用DataContext来移动数据,此新产品可能是prant窗口数据上下文的一部分。

    为您的用户控件添加依赖项属性,并绑定到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}"/>
    
    然后在窗口_NewProduct xaml中,您应该将此属性绑定到usercontrols依赖项属性

    <local:ProductUserControl x:Name="ProductUserControl" Product="{Binding Product}"/>
    
    然后在主窗口中,您只需创建一个新的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);
    }
    

    当我运行itI时,我得到了一个XamlParseException。我在添加依赖项属性后得到了Product属性,但是Product Binding导致了一个异常。您需要为Window_NewProduct将Product属性也添加到viewmodel,并且为usercontrol.K没有viewmodel,这也被清除了,但在代码的第二块中出现了新错误
    <local:ProductUserControl x:Name="ProductUserControl" Product="{Binding Product}"/>
    
    public Window_NewProduct(ProductDto product)
    {
        InitializeComponent();
    
        this.DataContext = new Window_NewProductViewModel() { Product = product };
    }
    
    var newProduct = new ProductDto();
    
    var window_NewProduct = new Window_NewProduct(newProduct);
    
    if (window_NewProduct.ShowDialog() == true)
    {
        Debug.WriteLine(newProduct.Code);
        Debug.WriteLine(newProduct.Name);
    }