2017-02-03 13 views
0

Вопрос в конценавигации между страницами с моделью обновить

Информация: Я использую Modern UI, но я думаю, что эта проблема не может быть связано только с этой схемой, поэтому я отправил его под «МОФ» и " привязки данных.

Что я пытаюсь выполнить:

У меня есть DataGrid с некоторыми простыми в нем данных (назовём Эти данные продукты). Я хочу создать следующую функцию. После двойного щелчка на строке пользователь перенаправляется на страницу «выпуск продукта» (назовем эту страницу ProductPage.xaml), где будет больше информации о продукте. Перед тем, как показывать все данные в пользовательское приложение, supposted вызывает SQL Server и запрашивает всю информацию о выбранном продукте. Позже пользователь может увидеть всю информацию о продукте, где он может ее редактировать. Пользователь принимает выпуски, нажимая на кнопку, если кнопка не была нажата, но если он перейдет на другую страницу, не нажимая эту кнопку, правки должны быть проигнорированы.

Проблема

После перенаправлению ProductPage.xaml с основной информацией о продукции, скрытой в Application.Current.Properties эта страница не обновляется. Конструктор не вызывается (поскольку я подозреваю, что это ожидаемое поведение), поэтому я создал метод, который вызывается после загрузки страницы, но даже если обновленная модель не обновляется. Все привязки корректно работают во время сперва Загрузка страницы (когда вызывается конструктор), но когда я возвращаюсь к datagrid и выбираю другую модель старой строки.

Код Как сделать перенаправление? Во-первых, то, что я сделал:

public void MouseDoubleClickMethod() 
{ 
/// getting id by row Id = ... 
var url = $"ProductPage.xaml?id={id}" 
BBCodeBlock bs = new BBCodeBlock(); 
Application.Current.Properties["product_id"] = Id; 
bs.LinkNavigator.Navigate(new Uri(url, UriKind.Relative), this); 
///some code 
} 

Моя модель упрощена

public class Product : INotifyPropertyChanged{ 
private decimal _price; 
public decimal Price 
    { 
     get { return _price; } 
     set 
     { 
      _price = value; 
      OnPropertyChanged(nameof(Price)); 

     } 
    } 
public event PropertyChangedEventHandler PropertyChanged; 

[NotifyPropertyChangedInvocator] 
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Мой связывании упрощенный (продукт является государственной собственностью)

<StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType=Page}}"> 
<StackPanel DataContext="{Binding Path=Product}"> 
<TextBox x:Name="Price" Text="{Binding Path=Price, Mode=TwoWay}" /> 

Мои после нагрузки метод упрощено

productId = (int)Application.Current.Properties["product_id"]; 
Product.UpdateFrom(Database.GetGetProduct(id)); // this method updates all fields in model 

Комментарии

Модель Меняется, но это текстовое поле не освежает. Текстовое поле хранит одни и те же данные независимо от привязки к свойству. Я использую ?id={id}, чтобы убедиться, что другая строка загружается, и без нее она продолжает показывать данные первой двойной строки.

Я подозреваю, что мои привязки неисправны.

Вопрос

Что я могу сделать с этим обязательным? Я хочу, чтобы мой текстовый ящик обновлялся после загрузки страницы не только при создании нового объекта. Если вы не знаете, что с ним делать, просто опубликуйте несколько предложений о том, как его отладить.

Это можно устранить, используя GUID как параметр в url, но я не хочу этого делать. Зачем? Он заставляет выполнять конструктор страницы (следовательно, перестраивает xaml).

ответ

1

Если я правильно помню, MUI при использовании его навигационной структуры кэширует данные для страницы. Он не создает представление (и впоследствии вашу модель представления) каждый раз, когда он перемещается. Чтобы поддержать это, MUI добавил навигационные события, чтобы вы могли подключаться к ним, чтобы получать уведомления, когда представления перемещаются в/из. в этих случаях вы можете обновить свои данные. От их wiki

Сделайте свое содержание навигации в курсе, реализуя интерфейс IContent в пространстве имен FirstFloor.ModernUI.Windows.

Возможно, ваша модель модели реализует интерфейс и нагрузку, обновите свои данные.