【问题标题】:Binding StringElement (MT.D) with MvvmCross使用 MvvmCross 绑定 StringElement (MT.D)
【发布时间】:2013-09-24 13:24:07
【问题描述】:

我们正在使用一些 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;
    }
}

【问题讨论】:

    标签: mvvmcross monotouch.dialog


    【解决方案1】:

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

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

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

    示例代码

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

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

    【讨论】:

      【解决方案2】:

      我尝试了如下视图模型:

      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),
                  };
      

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

      【讨论】:

      • 对不起 - 不是一个很好的答案,但我确实试图重现这个问题。我认为您的问题可能会受益于一些演示您的设置和问题的代码 - 请参阅 msmvps.com/blogs/jon_skeet/archive/2010/08/29/… 了解其他一些想法,以帮助您帮助 SO 提供答案。
      • 好的,我也尝试在我的 ViewModel 中使用你的计时器,结果很奇怪:StringElement 已更新但未刷新,一旦我滚动,它就会更新和刷新,并继续刷新每滴答声。
      • 好吧,似乎当初始属性值为空时......如果值发生变化,它不会刷新显示。如果初始属性是 string.Empty 那么一切正常
      • 好吧,不同的是:如果初始值为 null 或为空,则不起作用。如果初始值是像 test 这样的真实字符串,那么它将正确运行。我认为这与做一些检查的 RaisePropertyChanged 有关。但我不能确定。
      • 我也看到了这一点 - 如果字符串在某个点之前不需要值,那就太痛苦了。比如错误摘要标签什么的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2013-10-17
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多