最后的问题
信息:我使用的是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)。
答案 0 :(得分:1)
如果我没记错的话,MUI在使用它的导航框架时会缓存页面的数据。它不会在每次导航时构造视图(以及随后的视图模型)。为了支持这一点,MUI添加了导航事件供您挂钩,以便在导航到/从导航视图时收到通知。在这些事件中,您可以更新您的数据。来自他们的wiki
通过实现FirstFloor.ModernUI.Windows命名空间中提供的IContent接口,使您的内容导航更加清晰。
您可以让您的视图模型实现界面并在加载时刷新您的数据。