在模型刷新

时间:2017-02-03 01:27:44

标签: wpf data-binding wpf-controls modern-ui

最后的问题

信息:我使用的是Modern UI,但我认为这个问题可能与此框架无关,因此我将其发布在'wpf'和'data-binding'下。

我想要完成的任务:

我的数据网格中包含一些简单的数据(让我们称这个数据为产品)。我想创建以下功能。 双击行后,用户将被重定向到“产品版本”页面(让我们将此页面称为 ProductPage.xaml ),其中将提供有关产品的更多信息。在向用户应用程序显示所有数据之前,需要调用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

评论

模型DOES发生了变化,但文本框没有刷新。 无论绑定到属性,Textbox都会保留相同的数据。 我使用?id={id}来确保正在加载其他行,没有它它会一直显示第一个双击行的数据。

我怀疑我的绑定是错误的。

问题

这个绑定怎么办?我希望我的文本框在页面加载后不仅在构造新对象时刷新。如果您不知道如何处理它,请发布一些有关如何调试它的建议。

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

1 个答案:

答案 0 :(得分:1)

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

  

通过实现FirstFloor.ModernUI.Windows命名空间中提供的IContent接口,使您的内容导航更加清晰。

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