【发布时间】:2018-04-17 11:51:32
【问题描述】:
我将 Xamarin.Forms.ContentPage 的标题绑定到我的视图模型 (VM) 中的属性 BuggyTitle。 VM 派生自 MvxViewModel。这是简化版:
BuggyPage.xaml:
<?xml version="1.0" encoding="UTF-8"?>
<local:ContentPage Title="{Binding BuggyTitle}"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyProject.BuggyPage"
xmlns:local="clr-namespace:Xamarin.Forms;assembly=MyProject">
<ContentPage.Content NavigationPage.HasNavigationBar="false">
<Grid>
<ScrollView>
<!--and so on-->
</ContentPage.Content>
</local:ContentPage>
BuggyViewModel.cs:
namespace MyProject
{
[ImplementPropertyChanged]
public class BuggyViewModel : MvxViewModel
{
private Random _random;
public string BuggyTitle {get; set;}
public BuggyViewModel()
{
_random = new Random();
}
public override void Start()
{
base.Start();
BuggyTitle = "" + _random.Next(1000);
RaisePropertyChanged("BuggyTitle"); // this seems to make no difference
}
}
}
除了在构造函数中调用 InitializeComponent() 之外,后面的代码并没有发生太多事情。
该页面通常在我的项目中映射到虚拟机(实际上不是“我的”项目,它是现有设计),它归结为这些(同样,简化的)代码行:
public static Page CreatePage(MvxViewModelRequest request)
{
var viewModelName = request.ViewModelType.Name;
var pageName = viewModelName.Replace ("ViewModel", "Page");
var pageType = (typeof (MvxPagePresentationHelpers)).GetTypeInfo ().Assembly.CreatableTypes().FirstOrDefault(t => t.Name == pageName);
var viewModelLoader = Mvx.Resolve<IMvxViewModelLoader>();
var viewModel = viewModelLoader.LoadViewModel(request, null);
var page = Activator.CreateInstance(pageType) as Page;
page.BindingContext = viewModel;
return page;
}
问题:
当BuggyPage 加载时,我最初得到了正确的标题值。此后无论何时显示,即使我可以在调试器中看到BuggyTitle 正在正确更新,但更改不会出现在页面中。
问题:
为什么对BuggyTitle 的更新没有反映在页面中?
编辑 1:
为了进一步描述这种怪异之处,我在ContentPage 中添加了Label,以及x:Name="BuggyLabel" 和Text="{Binding BuggyLabelText}"。
在我的代码隐藏中,我添加了这个:
var binding_context = (BindingContext as BuggyViewModel);
if (binding_context != null)
{
BuggyLabel.Text = binding_context.BuggyLabelText;
}
我在BuggyLabel.Text = 处设置了一个断点。每次页面加载时它都会被命中,并且BuggyLabel.Text 似乎已经具有正确的值(即,无论binding_context.BuggyLabelText 设置为什么)。但是,实际显示的页面只显示此标签中的文本最初设置的内容。
是的,已经清理/构建了大约一百万次。
编辑 2(更怪异):
我把它放在代码隐藏中,以便它在页面加载期间运行:
var binding_context = (BindingContext as BuggyViewModel);
if (binding_context != null)
{
Device.BeginInvokeOnMainThread(() =>
{
binding_context.RefreshTitleCommand.Execute(null);
});
}
这再次更改了调试器中的值,但这些更改不会反映在显示的页面中。
然后我在页面上添加了一个按钮并将其绑定到RefreshTitleCommand,然后哇!页面更新其显示。
很遗憾,我不能使用它。这不仅令人难以置信的骇人听闻,而且我不能让用户按下按钮来让页面显示它在加载时的含义。
我想知道 MvvmCross 或 Xamarin 是否有一些缓存。
【问题讨论】:
-
BuggyTitle 是否有一个公共字段来获取和设置属性?
-
是的,抱歉,忘记在问题中添加它。我已经编辑了问题。
-
@Ash,删除代码隐藏代码。不需要它
-
不是我想要表达的意思。是的,我知道我不
need它。试图表明事情是多么奇怪。绑定显然是有效的,但视图只是拒绝显示更新。 -
因为你有 local:ContentPage,它可能做错了什么,但你没有显示代码。
标签: c# xamarin.ios xamarin.forms mvvmcross