0

这个问题源于https://github.com/slodge/MvvmCross/issues/367线程内部的讨论。

如果我们遵循最近使用 MvvmCross 框架设置绑定的示例,那么我们只需使用 Bind()、To() 扩展设置绑定来控制属性(如 UILabel.Text):

this.DelayBind(() => {
    var set = this.CreateBindingSet<KittenCollectionCell, Kitten>();
    set.Bind(NameLabel).To(kitten => kitten.Name);
    set.Bind(PriceLabel).To(kitten => kitten.Price);
    set.Bind(_loader).To(kitten => kitten.ImageUrl);
    set.Apply();
});

(取自https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-11-KittenView_Collections/KittenView.Touch/Views/KittenCollectionCell.cs

但是,如果我想根据 DataContext 中的一些值调整我的 UI 状态怎么办。例如,我想显示/隐藏一些按钮和标签并调整一些约束值。

if (((UserInfo)DataContext).IsAdmin)
{
    SaveButton.Hidden = false;
    SecurityLabelConstraint.Constant = 50;

    /* etc */
}

如何监听 DataContext 更改事件?这里推荐的方法是什么?

谢谢。

4

2 回答 2

0

到目前为止,我决定将每个控件或约束绑定到 DataContext 的适当属性,例如:

this.DelayBind(() => {
    var set = this.CreateBindingSet<UserCell, UserInfo>();

    set.Bind(SecurityLabelConstraint).For(p => p.Constant).To(info => info.IsAdmin)
        .WithConversion(new ValueConverter<string>(s => s != null ? 20 : 0), null);

    // etc...

    set.Apply();
});

它工作得很好。

于 2013-07-22T04:54:57.983 回答
0

有几种方法可以实现这一点。

最简单的方法之一是您已经确定自己的方式 - 例如直接绑定 SecurityLabelConstraint - 例如使用Tibet绑定:

set.Bind(SecurityLabelConstraint)
   .For(p => p.Constant)
   .To("If(info.IsAdmin, 20, 0)");

或者,如果需要复杂的逻辑(超出西藏绑定引擎的范围或性能),那么您可以实现绑定到单元格上的属性 - 或中间对象。

例如,您可以有一个 Wrapper 类,它实现:

 public class Wrapper
 {
     private NSLayoutConstraint _constraint;
     public Wrapper(NSLayoutConstraint constraint)
     {
         _constraint = constraint;
     }

     private string _foo;
     public string Foo
     {
        get { return _foo; }
        set
        {
           _foo = value;
           // your complex logic on _constraint goes here
        }
     }
 }

如果您将_wrapper实例存储在单元格上的字段中,则可以将其绑定为:

set.Bind(_wrapper)
   .For(p => p.Foo)
   .To(info => info.IsAdmin);

如果您改为将 Foo 属性放在单元格上,那么您可以使用:

set.Bind()
   .For(cell => cell.Foo)
   .To(info => info.IsAdmin);

实现绑定的最后一种方法是尝试直接连接到单元格DataContext并使用PropertyChanged处理程序 - 我不推荐这样做,因为它往往会有点难以维护,并且在访问 NSObject 内部时很容易造成内存泄漏事件回调。

于 2013-07-22T13:45:36.187 回答