0

我们正在使用一些 MT.D StringElements,它们的 Value 属性绑定到 ViewModel 中的属性。

初始值已正确显示,但当 ViewModel 更改某些值并触发 PropertyChanged 时,StringElements 包含良好值但显示未刷新。

如果我们滚动控制器或触摸 StringElement,它就会被刷新:显示正确的值。

你有什么主意吗?


这是我们的视图控制器

public class ContactView : MvxDialogViewController
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        var bindings = this.CreateInlineBindingTarget<ContactViewModel> ();

        Root = new RootElement()
        {
            new Section()
            {
                new StringElement("Company Name").Bind(bindings, vm => vm.CompanyName)
            }
        }
    }
}

这是我们的 ViewModel(简化版)

public class ContactViewModel : MvxViewModel
{
    private string companyName;
    public string CompanyName{
        get{return companyName;}
        set{companyName = value; RaisePropertyChanged(() => CompanyName);}
    }

    public async Task Init(string id)
    {
        var contact = await someService.SomeMethodAsync();
        CompanyName = contact.CompanyName;
    }
}
4

2 回答 2

1

我找到了两个解决我的问题的方法:

  • 如果我使用 UIView.Transition 替换内容,那么在新视图中,当我更改 ViewModel 时不会刷新任何内容(除非我滚动或点击它),除非ViewModel 属性具有一些非 null 和非空的默认值

  • 如果我不转换而是使用像这样的另一种方法来替换内容:

示例代码

 MasterNavigationController.PopToRootViewController(false);
 MasterNavigationController.ViewControllers = new UIViewController[] { viewController };

在这种情况下,当 ViewModel 属性更改时,内容被替换并刷新视图:在这种情况下一切正常。

于 2013-09-24T18:59:02.977 回答
0

我尝试了一个视图模型,例如:

public class FirstViewModel 
    : MvxViewModel
{
    private Timer _timer;
    private int _count;

    public FirstViewModel()
    {
        _timer = new Timer(DoThis, null, 1000, 1000);    
    }

    private void DoThis(object state)
    {
        _count++;
        TextProperty = _count.ToString();
    }

    private string _textProperty = "T";
    public string TextProperty
    {
        get { return _textProperty; }
        set { _textProperty = value; RaisePropertyChanged(() => TextProperty); }
    }
}

对话框视图定义如下:

        Root = new RootElement("Example Root")
            {
                new Section("Debut in:")
                    {
                        new EntryElement("Login", "Enter Login name").Bind(bindings, vm => vm.TextProperty)
                    },
                new Section("Debug out:")
                    {
                        new StringElement("Value is:").Bind(bindings, vm => vm.TextProperty),
            };

它工作得很好 - 每秒都在滴答作响......

于 2013-09-24T14:01:36.083 回答