2011-11-16 13 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; 

私は何とかXAMLでCampersPageの名前空間にAddNewCamperの名前空間を追加する必要がありますか?

<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。 CamperはObservableCollectionです – TMan

+0

私の主な問題はAddNewCamperのCampersPageにどうやってアクセスするのですか? CampersPage c = new CampersPage()などが動作しない – TMan

答えて

4

私はあなたが間違ったWPFを使用しているが、あなたは確かにあなたの人生を困難にしていると主張する限り行くことはありません。 MVVMパターンで少し読んでみることをお勧めします。実際にはWPFの開発が容易になりました(ここでは良いスタートarticle)。、あなたの窓/ページはの適切

  • 結果を動作するように、互いについてあまりにも多くの知識を持っている必要があり

    • です:現時点では、使用している

      アプローチはいくつかのレベルで正しくありません。あなたの子ウィンドウで親フォームへの依存性(あなたが本当に必要なものながら、窓に依存である文脈、実際にキャンパーがをリストアップしている)

    • あなたはあまりを行う必要があります(WPFは自動的にそれを行うのに最適なツールを備えていながら)マニュアル通知は/
    • あなたの目標を達成するために設定あなたは

    MainWindow)ビューを介してモデル(allCampers)を露出しているように見えるこのすべてはで解決することができます再設計のビット:

    1. をあなたのビュー(メイン、CampersPage、AddNewCamper)は(基本的に彼らのためにビューモデルかもしれない)BindingCamperクラスではなく、の相互
    2. 同じインスタンスに依存する必要がありますはすべてDataContextに設定する必要があります。
    3. は手動でバインディングを追加する必要はありません。すべてのことができます(とすべきである)XAML
    4. から
    心の中で上記持つ

    を行うことが、あなたのCampersPageクラスは次のようになります。

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

    それは決して親ウィンドウのデータを初期化し、それが結合ます設定する必要があります。これは単に間違っています。

    実際には、すべてのビュークラス(AddNewCamperおよびMainWindowもそうです)でこの方法(コンストラクタを使用してデータコンテキストを提供する)を使用できます。あなたはキャンピングカーのページを必要とするとき

    は今、あなたのメインウィンドウから、それは非常に簡単になると言う:

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

    それはAddNewCamperウィンドウと同じです。データのコンテキストに渡すだけです。すべてだ

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

    :あなたは新しいキャンピングカーを追加すると、(データコンテキストを介して利用可能である)BindingCamper.Campersリストに追加します。データバインディングと観測可能なコレクションのメカニズムを組み合わせることで、この新しい要素はすぐにMainWindowCampersPageの両方に表示されます。

    編集:

    コードデータベースからキャンピングカーを取得するには、DALの一部として(DAOオブジェクトのいくつかの種類を持つラッパーでなければなりません - 私が知っている、醜い流行語の多くは、幸いにもそれらはすべて関連していますかなり明白です)。たとえば、あなたがデータベースからキャンピングカーを得るに対処するクラス持つことができます:あなたの迅速な解決を与えるために

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

    を、あなたは再びGetAllCamptersメソッドを呼び出し、BindingCamperのための監視可能なコレクションを構築し、CampersProviderMainWindowにコンストラクタを渡すことができます。しかし、これはあまりMVVMのアプローチではありません。これらのものは通常、ビューモデル(まだ別の別のクラス)によって処理されます。

    投稿したコードにはかなりの作業が必要ですが、MVVMパターンについて少し読んでアプリケーションに適用しようとすると悪い考えではないと思います。

  • +0

    実際にはかなりイージー。私がデータベースに入力するコードや、すべてのソート方法など、私の他のすべての情報はどうでしょうか?とxamlは同じですか?あなたの入力に感謝、私は確信しているように、これは私の最初のwpfプロジェクトですLOL – TMan

    +0

    メインウィンドウのように、データベースから来る私のallcampersリストです。私は、私のobservablecollection上のすべてのキャンパーに入るためにループが必要ですので、プログラムが起動するとすべての名前がそこにあります – TMan

    +0

    @TMan:データベースや関連するものにアクセスするコードについて - これは通常DAL(Data Access Layer )あなたのプログラムの一部。これはViewModelスコープの外にあるビジネスロジックの一部です。このようなことに対処する方法については私の編集を参照してください。 –

    関連する問題