2017-06-04 118 views
1

我使用帶有網格的窗口加載來自MongoDB的對象。這些對象包含列表。現在我想從這個對象之一加載一個列表。這是從窗口來源:WPF網格沒有顯示內容

 public void btn_load_Click(object sender, RoutedEventArgs e) 
    { 
     MainWindow M = new MainWindow(); 

     ArtikelLaden(); 
     M.RefreshGrid(); 

     Close(); 

    }`   
public void ArtikelLaden() 
    { 

     MainWindow M = new MainWindow(); 
     rowindexArtikel = dg_Artikel.SelectedIndex; 
     Artikel B = new Artikel(); 
     B = artikelList[rowindexArtikel]; 
     M.loadArtikel(B); 
    } 

名單應在主窗口得到加載:`

public void loadArtikel(Artikel B) 
    { 
     dg_test.ItemsSource = null; 
     dg_test.ItemsSource = B.kaufList; 
     dg_test.Items.Refresh(); 
     MessageBox.Show(dg_test.HasItems.ToString()); 
     MessageBox.Show(dg_test.Items.Count.ToString()); 

     dg_Teile.ItemsSource = null; 
     dg_Teile.ItemsSource =B.teilList; 
     dg_Teile.Items.Refresh(); 

     //dg_Teile.Items.Refresh(); 
     //dg_BauGrp.ItemsSource = B.bauList ; 
    } 
    public void RefreshGrid() 
    { 
     //dg_Kaufteile.UpdateLayout(); 
     //dg_Kaufteile.Items.Refresh(); 
     //dg_Teile.UpdateLayout(); 
     MessageBox.Show(dg_Kaufteile.HasItems.ToString()); 
     MessageBox.Show(dg_Kaufteile.Items.Count.ToString()); 
    } 

當你看到一些古董的東西源僅僅是因爲我現在測試成千上萬的可能性。但MainWindow中的網格總是空着。

第一個MsgBox表示網格有內容。稍後在刷新方法中的第二個MsgBox它說它是空的?!

當我加載列表在第一個窗口中的作品。網格啓用了AutoColumn。

`

+1

熟悉MVVM。所有關於MongoDB的邏輯應該由視圖模型來處理和協調。在XAML中使用綁定。另外,當使用ItemsControls(如ListBox,ComboBox等)時,您應該只使用ItemsSource並避免碰觸Items屬性。如果您正確設置綁定,則無需手動調用刷新。 (爲什麼你設置一個變量/屬性,然後在下一個代碼行中重新設置它(如「B」,「dg_test.ItemsSource」,「dg_Teile.ItemsSource」)?這很愚蠢......) – elgonzo

+0

在WPF中,您不能只設置綁定的項目,並期望它們只顯示在GUI中,您必須通知屬性系統新項目已更改。查找WPF的INPC或DependencyObject。 –

+0

我知道它不是完美的/最好的/正確的方式,mvvm將在未來計劃,但我想創建一個工作原型來學習所有的基礎知識,然後從一個正確編碼的GUI開始。 –

回答

0

您正在創建的MainWindow一個新的實例,但你可能要訪問的已經存在的,你在屏幕上看到的。試試這個:

public void btn_load_Click(object sender, RoutedEventArgs e) 
{ 
    MainWindow M = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault(); 

    ArtikelLaden(M); 
    M.RefreshGrid(); 

    Close(); 
} 

public void ArtikelLaden(MainWindow M) 
{ 
    rowindexArtikel = dg_Artikel.SelectedIndex; 
    Artikel B = new Artikel(); 
    B = artikelList[rowindexArtikel]; 
    M.loadArtikel(B); 
} 
+0

非常感謝你! –