2015-12-05 71 views
0

我有2個窗口的父窗口 - Window_Products和子窗口 - Window_NewProductWPF - 如何從子窗口值到父窗口

1)在我Window_Products

  • 我有一個列表的ObservableCollection產品列表該窗口中顯示)的產品清單
  • 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因爲我使用用戶控制作爲頁以及窗口

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

3)在我的產品用戶控制

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

4)在我ProductViewModel

  • 我有存儲在它像PROD_NAME,Prod_Code值這個對象產品。
  • 我想要的是這個對象在我將產品保存到數據庫後,產品返回到父窗口(Window_Products),以便我可以將新產品添加到上面的可觀察集合中。
  • 我的對象如何通過usercontrol,子窗口從視圖模型返回,然後到達父窗口。

幫我解決這個問題。提前致謝。

回答

0

作出的indow_NewProduct一個新的構造:

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

在您的例子: 1)在我Window_Products變爲:

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>); 
} 

幾件事情:1。 這是不好的,但它可能適合您的需求: 2.看看MVVM和MVC,將它們結合起來也有控制器。 3.在WPF中,您應該儘可能多地使用DataContext來移動您的數據,這個NewProduct可能是prant的窗口數據上下文的一部分。

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則不應將此屬性綁定到用戶控件依賴屬性

<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); 
} 
+0

我得到一個XamlParseException當我運行它 – user5552042

+0
+0

我收到產品屬性的添加依賴屬性之後,但在產品綁定的是引起異常 – user5552042