0

Now on Page 1 をC# WPF使用してページをホストするウィンドウがあります。ページ 1 で項目をダブルクリックすると、新しいウィンドウ (ページ 2) が開き、項目を編集できます。アイテムが編集されると、 に保存されます。今私が抱えている問題は、Page2 が閉じられると更新されないことです。基本的に、変更を表示するには、ページから離れてページに戻る必要があります。Page2 から Page1 を更新して変更を表示する方法はありますか? これが私のコードですthis.WorkingFrame.Navigate(Page1);listviewlistviewdatacontextlistview

public partial class Page1 : Page
{
    public Page1()
    {            
        InitializeComponent();
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        //initiates the method to load data into the list view
        LoadLV();
    }
    //Loads data into the list view object
    public void LoadLV()
    {

        auroraDataEntities = new AuroraDataEntities();
        Data data = new Data();
        ObjectQuery<Inventory> inventories = auroraDataEntities.Inventories;
        //Returns only objects with a quantity greater than 0, so it won't show anything you are out of
        var fillList = from q in inventories
                       where q.Qty > 0
                       select q;
        ingListLV.ItemsSource = fillList.ToList();

     }
    //Method to open what I want to be the child window basically a popup Dialog box
    private void Open_Page2(object sender, RoutedEventArgs e)
    {
        Page2 openPage2 = new Page2();
        openPage2.Show();

    }
}

    //This is the code for Page 2
public partial class Page2 : Window
{    


     public Page2()
    {            
        InitializeComponent();
        //ADDED a reference to Page1 in the constructor
        Page1 page1;
    }

    //Method when i click the close button on the page
    private void Close_Button(object sender, RoutedEventArgs e)
    {
    //In here is the code that I want to use to refresh the listview on page 1
            //ADDED the call to the public method LoadLV on page 1
            page1.LoadLV()              
    }
}
4

2 に答える 2

1

この問題はさらに一般的です。ビューは任意に複雑になる可能性があり、どこかで変更されたデータは別の場所で無効化/更新する必要があります。親子関係にある 2 つのウィンドウだけでなく、タブまたは動的フローティング ウィンドウを含む複雑なネストされたビューがあるとします。どうやら、これは「子から親を更新する」だけではないようです。

では、これに対する可能なアプローチは何ですか?答えは、 messagingpublish-subsribeパターンです。Event Aggregatorが必要です。たとえば、Prism4 にあります。アグリゲーターを使用すると、ビューでメッセージをサブスクライブし、メッセージを発行できます。

あなたの場合のメッセージング アーキテクチャは単純です。次のようなイベントが必要です

public class BusinessEntityUpdatedEvent : CompositePresentationEvent
{
   public object Entity { get; set; }

   //or

   // if your entities share a common base class
   public EntityBase Entity { get; set; }   

   //or

   public justAnything ofAnyType { get; set; }
   public orEvenMore ofAnotherType { get; set; }
}

次に、親ビューがそのイベントをサブスクライブし、子ビューがイベントを発行して、更新されたエンティティをイベント パラメーター内に渡します。

アプリケーションのさまざまな領域間のメッセージングのアイデアが得られると、コードの結合がはるかに少なくなり、「これら 2 つのクラス間に接続があるかどうか、おそらく親子関係があるかどうか」という観点から考えるのをやめます。むしろ、「あちらからあちらへどんなメッセージが流れるべきか」という観点から考えるようになります。

編集短期的な解決策は次のとおりです。

public class Page1
{ 
   private void OpenPage2()
   {
      Page2 p = new Page2( this );
      p.Show();
   }

   public void LoadLv() ...
}

public class Page2
{
   private Page1 page1;
   public Page2( Page1 page1 )
   {
      this.page1 = page1;
   }

   public void CloseButton()
   {
      this.page1.LoadLV();
   }
}
于 2013-08-10T17:01:54.573 に答える
0
MainWindow mainWindow = new MainWindow();

mainWindow.Closed += (s, eventarg) =>
{
    // Your method to update parent window
};

mainWindow.Show();
于 2021-04-03T10:06:57.087 に答える