2013-08-10 11 views
0

В C#WPF У меня есть окно, в котором находится страница с this.WorkingFrame.Navigate(Page1); Теперь на странице 1 У меня есть listview. На странице 1 вы можете дважды щелкнуть элемент в listview, чтобы открыть новое окно (Страница), чтобы отредактировать элемент. После редактирования элемента он сохраняется на datacontext. Теперь проблема, с которой я столкнулась, когда-то закрыта, а listview не обновляется. В основном я должен перейти от страницы и вернуться к ней, чтобы показать ее изменения. Есть ли способ обновить страницу Page1 из Page2, чтобы показать сделанные изменения? Вот мой кодОбновить страницу WPF из дочернего окна

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

Вы должны смотреть на использовании наблюдаемых коллекций, если вы используете его правильно ваш пользовательский интерфейс будет отражать изменения автоматически. Ваши изменения отразятся на странице 1 еще до закрытия диалогового окна –

ответ

1

Проблема еще более общее - вид мог быть сколь угодно сложным и данные модифицированные где-то должны быть признаны недействительными/обновляется где-то в другом месте. Предположим, у вас есть не только два окна в отношении родитель-потомок, но и сложные вложенные представления с вкладками или динамическими плавающими окнами. По-видимому, речь идет не только о «обновлении родителя от ребенка».

Итак, каков возможный подход к этому? Ответ: обмен сообщениями, публикация-публикация образец. Вам нужен 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; } 
} 

, а затем ваш родительский вид подписывается на это событие, и ваш взгляд ребенка публикует событие, передав обновленный объект внутри параметров событий.

Как только вы получаете идею обмена сообщениями между различными областями вашего приложения, ваш код становится гораздо менее связанным, вы перестаете думать в терминах «существует ли связь между этими двумя классами? Возможно, существует отношение родитель-ребенок»? но вы начинаете думать о терминах «какое сообщение должно проходить оттуда туда?».

Редактировать короткий срок решения будет:

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

Это звучит так, как будто это будет очень полезно для того, что я хочу делать в будущем, но поскольку я новичок в C# и WPF, я не уверен, где код будет идти и что «JustAnything» должно быть установлено, можете ли вы привести пример, используя мой код? –

+0

Первое свойство - пример - вы передаете сущность, которая была обновлена. На стороне абонента у вас есть два параметра после обнаружения уведомления: либо вы просто обновляете весь вид (переписываете список), либо обновляете только элемент, который передается внутри уведомления. –

+0

Просматривая это, то, что вы предлагаете, - это способ усложнить то, что мне нужно. Все, что мне нужно, это чтобы страница2 обновляла страницу1, когда она закрывается. –

Смежные вопросы