使用模型刷新在页面之间导航

Navigation between pages with model refresh

问题在最后

信息:我使用 Modern UI 但我认为这个问题可能不仅仅与这个框架有关,因此我 post 在 'wpf' 和 [=75= 下编辑了它].

我要完成什么:

我有一个包含一些简单数据的数据网格(我们称此数据为 products)。我想创建以下功能。 双击行后,用户将被重定向到 'product edition' 页面(我们称此页面为 ProductPage.xaml),其中将提供有关产品的更多信息。在向用户应用程序显示所有数据之前,支持post调用SQL 服务器并询问有关所选产品的所有信息。稍后用户可以看到有关产品的所有信息,他可以在其中进行编辑。用户通过单击按钮接受版本,如果未单击按钮,但如果他没有单击此按钮就转到其他页面,则应忽略编辑。

问题

重定向至 ProductPage.xaml 后,有关产品的基本信息隐藏在 Application.Current.Properties 中,此页面未刷新。 构造函数没有被调用(因为我怀疑这是预期的行为)因此我创建了在页面加载后调用的方法但是即使模型正在刷新页面也没有。在 第一次 页面加载期间(调用构造函数时)所有绑定都正常工作,但是当我返回数据网格并选择不同的行时,旧模型存在。

代码 如何进行重定向?首先我做的是:

 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));
    }
}

我的绑定简化了(产品是public属性)

<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} 来确保正在加载其他行,如果没有它,它会一直显示第一个双击行的数据。

我怀疑我的绑定有问题。

问题

我可以用这个绑定做什么?我希望我的文本框不仅在构建新对象时在页面加载后刷新。如果您不知道如何处理它,只需 post 一些关于如何调试它的建议。

这可以通过在 url 中使用 GUID 作为参数来解决,但我不想那样做。为什么?它强制执行页面构造函数(因此重建xaml)。

如果我没记错的话,MUI 在使用它的导航框架时会缓存页面数据。它不会在每次导航时构建视图(以及随后的视图模型)。为了支持这一点,MUI 添加了导航事件供您挂钩,以便在导航视图时收到通知 to/from。在这些事件中,您可以更新您的数据。来自他们的 wiki

Make your content navigation aware by implementing the IContent interface available in the FirstFloor.ModernUI.Windows namespace.

您可以让视图模型实现接口并在加载时刷新数据。