2011-11-16 73 views
0

如果我在一個列表視圖中插入項目的頁面中有一個observablecollection。我怎樣才能從不同的窗口(類)添加到相同的observablecollection(listview)?我不想使用INotifyPropertyChanged和所有。我想要做的就是將一個項目添加到現有的列表視圖。我已經嘗試了一切,我無法弄清楚。請任何幫助表示讚賞。添加到ObservableCollection

CampersPage ...(BindingCamper只是我的基本上是說新的ObservableCollection()方法

public partial class CampersPage : Page 
{ 
    MainWindow _parentForm; 
    public GridViewColumnHeader currentColumnSorted = null; 
    private SortAdorner currentAdorner = null; 
    String request1; 
    String request2; 
    String request3; 
    String request4; 
    // public ObservableCollection<Camper> Campers { get; private set; } 


    public CampersPage(MainWindow parent) 
    { 
     _parentForm = parent; 
     InitializeComponent(); 
     _parentForm.bindings = new BindingCamper(); 

     for (int i = 0; i < _parentForm.allCampers.Count; i++) 
     { 


      if (_parentForm.allCampers[i].getRequest(1) != null && _parentForm.allCampers[i].getRequest(2) != null && _parentForm.allCampers[i].getRequest(3) != null && _parentForm.allCampers[i].getRequest(4) != null) 
      { 
       request1 = _parentForm.allCampers[i].getRequest(1).getName(); 
       request2 = _parentForm.allCampers[i].getRequest(2).getName(); 
       request3 = _parentForm.allCampers[i].getRequest(3).getName(); 
       request4 = _parentForm.allCampers[i].getRequest(4).getName(); 

      } 

      _parentForm.bindings.Campers.Add(new Camper { FirstName = "" + _parentForm.allCampers[i].getFirstName(), LastName = "" + _parentForm.allCampers[i].getLastName(), Ages = _parentForm.allCampers[i].getAge(), SchoolGrade = _parentForm.allCampers[i].getGrade(), Gender = "" + _parentForm.allCampers[i].getGender(), bindingRequest1 = request1, bindingRequest2 = request2, bindingRequest3 = request3, bindingRequest4 = request4 }); 
      //DataContext = _parentForm.bindings; 
     } 

     DataContext = _parentForm.bindings; 



    } 

---現在,我點擊一個按鈕和一個新的窗口出現在這裏我想補充一個新營員在CampersPage列表視圖。

 public partial class AddNewCamper : Window 
{ 
    MainWindow _parentForm; 


    public AddNewCamper(MainWindow parentForm) 
    { 
     InitializeComponent(); 
     _parentForm = parentForm; 
     // _parentForm.bindings = new BindingCamper(); 

    }private void btnSubmitNewCamper_Click(object sender, RoutedEventArgs e) 
    { 
     String firstName = txtNewFirstName.Text; 
     String lastName = txtLastName.Text; 

     int age; 
     int grade; 
     String newage = comboNewAge.Text; 
     if (firstName != "" && lastName != "" && IsNumber(txtNewGrade.Text) && newage != "") 
     { 
      age = Convert.ToInt16(newage); 
      grade = Convert.ToInt16(txtNewGrade.Text); 

      // Create New Camper 
      Camper person = new Camper(age, grade, boxNewGender.Text, firstName, lastName); 

      _parentForm.allCampers.Add(person); 
      //This is just adding the camper to the listview. Not sure if it is actually adding it to the database. 
      _parentForm.bindings.Campers.Add(new Camper { FirstName = person.getFirstName(), LastName = person.getLastName(), Ages = person.getAge(), SchoolGrade = person.getGrade() }); 
      //CampersPage p = new CampersPage(_parentForm); 
      DataContext = _parentForm.bindings; 

我必須AddNewCamper的命名空間在某種程度上增加CampersPage的命名空間在XAML?

<ListView HorizontalAlignment="Stretch" Margin="0,12" x:Name ="listViewCampers" ItemsSource="{Binding Campers}" DisplayMemberPath="bindMe" IsSynchronizedWithCurrentItem="True" Grid.Column="1"> 

的ObservableCollection類:

 public partial class BindingCamper 
{ // This class assist in binding campers from listview to the textboxes on the camperspage 
    public ObservableCollection<Camper> Campers { get; set; } 
    public ObservableCollection<Staff> StaffMembers { get; set; } 
    public ObservableCollection<Schedule> schedule { get; set; } 
    public ObservableCollection<Group> Groups { get; set; } 



    public BindingCamper() 
    { 
     Campers = new ObservableCollection<Camper>(); 
     StaffMembers = new ObservableCollection<Staff>(); 
     schedule = new ObservableCollection<Schedule>(); 
     Groups = new ObservableCollection<Group>(); 

    } 
+1

@parapura,這是一個誤導性的聲明。我可以給你成千上萬的例子,其中沒有'INotifyPropertyChanged'和'ObservableCollection' WPF可以很好地工作。 –

+0

我正在使用observableCollection,我只是沒有顯示它。 _parentForm.Bindings.Camper。露營者是ObservableCollection – TMan

+0

我想我的主要問題是如何訪問AddNewCamper中的CampersPage? CampersPage c = new CampersPage()例如不起作用 – TMan

回答

4

我不會去儘可能聲稱你使用WPF錯,但你肯定讓您的生活困難。我建議讀一下MVVM模式 - 它真的讓WPF開發更容易(這裏是很好的開始article)。您正在使用的那一刻

做法是不正確的幾個層次:

  • 你的windows /網頁都需要對方太多的知識應用到工作正常
  • 結果是,是在父窗體在你的子窗口的依賴(當你真正需要的是在窗口背景,這實際上是營員名單依賴)
  • 你需要做的太多了手動通知/設置來實現自己的目標(而WPF有偉大的工具來自動執行)
  • 你似乎暴露通過視圖模型(allCampers)(MainWindow

所有這一切都可以用解決有點重新設計的:

  1. 你的看法(主,CampersPage,AddNewCamper)應該依賴於BindingCamper類(基本上可能是他們瀏覽模式),不上對方
  2. 相同的實例應該設置爲DataContext所有人
  3. 不應該手動添加綁定(就像你現在這樣做);都可以(也應該)從XAML

具有高於記做,你CampersPage類應該是這樣的:

public partial class CampersPage : Page 
{ 
    public CampersPage(BindingCamper camper) 
    { 
     InitializeComponent(); 
     DataContext = camper; 
    } 
} 

它應該決不是父窗口初始化數據和設置的綁定。這是完全錯誤的。實際上,這種方法(通過構造函數提供數據上下文)可以用在你所有的視圖類中(大概是AddNewCamperMainWindow)。

現在,當你需要的營員頁面,說從你的主窗口,它會非常容易:

public partial class MainWindow : Window 
{ 
    public void ShowCampers() 
    { 
     var campersPage = new CampersPage((BindingCampers) this.DataContext); 
     // show campersPage 
    } 
} 

它與AddNewCamper窗口相同。只需傳遞它的數據上下文。當您添加新的營員,將其添加到BindingCamper.Campers列表(可通過數據上下文):

// rest of the btnSubmitNewCamper_Click method elided 
Camper person = new Camper(age, grade, boxNewGender.Text, firstName, lastName); 
((BindingCamper)this.DataContext).Campers.Add(person); 

這就是全部。由於數據綁定和可觀察收集的組合機制,這個新元素將立即在MainWindowCampersPage之間可見。

編輯:

代碼來從數據庫露營者應包裝與某種DAO對象(作爲DAL的一部分 - 我知道,很多醜陋流行語,但幸運的是,他們都是相關的相當明顯)。例如,你可以有一個類,將處理得到的營員來自數據庫:

public class CampersProvider 
{ 
    public IEnumerable<Camper> GetAllCampers() 
    { 
     // here you put all your code for DB interaction 
     // and simply return campers 
    } 
} 

爲了讓你快速的解決方案,你可以再次通過CampersProviderMainWindow構造函數,調用GetAllCampters方法,並建立觀察到的集合爲BindingCamper。但是,這不是很MVVM的方法。這些東西通常是由視圖模型(又一個單獨的類)處理的,目前你沒有。

您發佈的代碼需要很多工作,如果您閱讀了一些關於MVVM模式並嘗試將其應用於您的應用程序,我認爲這不是一個壞主意。

+0

是的,這聽起來確實很容易。我的所有其他信息如何,如我輸入數據庫的代碼,以及所有排序方法。 xaml會一樣嗎?感謝您的意見,因爲您已經可以告訴我確定,這是我的第一個wpf項目lol – TMan

+0

與主窗口一樣,我的allcampers列表來自數據庫。我需要一個for循環來在我的observablecollection上輸入所有這些營員,這樣當程序啓動時,所有的名字都會在那裏 – TMan

+0

@TMan:至於代碼來訪問數據庫和相關的東西 - 這通常是DAL(數據訪問層)你的程序的一部分。它是ViewModel範圍之外的業務邏輯的一部分。看看我的編輯如何處理這個東西。 –

相關問題