gpt4 book ai didi

c# - Xamarin.Forms 绑定(bind)在初始值后不更新

转载 作者:太空狗 更新时间:2023-10-29 22:35:49 24 4
gpt4 key购买 nike

我将我的 Xamarin.Forms.ContentPage 的标题绑定(bind)到我的 View 模型 (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() 之外,后面的代码没有太多内容。

该页面一般映射到我项目中的 VM(实际上不是“我的”项目,它是现有设计),它归结为这些(再次简化的)代码行:

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 的更新没有反射(reflect)在页面中?

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

这再次更改了调试器中的值,但这些更改不会反射(reflect)在显示的页面中。

然后我向页面添加了一个按钮并将其绑定(bind)到 RefreshTitleCommand,哇哦!页面更新其显示。

不幸的是我不能使用它。它不仅非常骇人听闻,而且我无法让用户按下按钮让页面显示它在加载时的含义。

我想知道 MvvmCross 或 Xamarin 是否正在进行一些缓存。

最佳答案

回答

您需要在BuggyTitle 属性声明中添加RaisePropertyChanged

View 模型

namespace MyProject
{
[ImplementPropertyChanged]
public class BuggyViewModel : MvxViewModel
{
private Random _random;

string _BuggyTitle { get; set; }

public string BuggyTitle
{
get { return _BuggyTitle; }
set { _BuggyTitle = value; RaisePropertyChanged(() => BuggyTitle); }
}

public BuggyViewModel()
{
_random = new Random();
}

public override void Start()
{
base.Start();
BuggyTitle = "" + _random.Next(1000);
}
}
}

-----新更新------

代码隐藏

var binding_context = (BindingContext as BuggyViewModel);
if (binding_context != null)
{
Device.BeginInvokeOnMainThread(() =>
{
BuggyLabel.Text = binding_context.BuggyLabelText;
});
}

关于c# - Xamarin.Forms 绑定(bind)在初始值后不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47117938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com