MvvmCross Android 在代码中绑定
MvvmCross Android binding in code
我有一个 MVX 感知 activity,它有一个 AViewModel
类型的视图模型。 AViewModel
有一个 属性 类型 BViewModel
。 AView
创建一个在代码中创建子视图的外部函数。子视图可能如下所示:
var editText = new EditText(context);
editText.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
editText.TextSize = 40f;
var textView = new TextView(context);
textView.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
textView.TextSize = 40f;
var linearLayout = new LinearLayout(context);
linearLayout.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);
linearLayout.AddView(editText);
linearLayout.AddView(textView);
然后将 linearLayout
添加到 AView
。当我 运行 它时,视图显示正确。
现在我需要给它添加绑定。
创建子视图的外部代码只知道BViewModel
。它不知道 AViewModel
,所以我尝试创建一个新的绑定上下文和所有者
class BindingContextOwner : IMvxBindingContextOwner
{
public BindingContextOwner(IMvxBindingContext bindingContext)
{
this.BindingContext = bindingContext;
}
public IMvxBindingContext BindingContext { get; set; }
}
var contentContext = new MvxAndroidBindingContext(this, this);
contentContext.DataContext = this.ViewModel.BViewModel;
var contentBindingOwner = new BindingContextOwner(contentContext);
其中 this
是我的 MVX 感知 activity。然后我将 contentBindingOwner 传递给我的外部代码并尝试进行绑定
var set = bindingOwner.CreateBindingSet<IMvxBindingContextOwner, BViewModel>();
set.Bind(editText).For(v => v.Text).To(vm => vm.Foo).TwoWay();
set.Bind(textView).For(v => v.Text).To(vm => vm.Foo)
set.Apply();
当我 运行 代码时,视图显示正确,但绑定不起作用。没有任何反应,我也没有看到任何可以提供帮助的日志消息。
有人知道我做错了什么吗?
编辑:现在,我觉得自己很愚蠢。我的代码工作得很好。问题是我没有看到文本视图,因为默认情况下线性布局是水平的。所以文本视图不在视图中。好吧,也许这个post可以作为参考
代码有效,问题是文本视图不在视图中。详情请见 OP!
我有一个 MVX 感知 activity,它有一个 AViewModel
类型的视图模型。 AViewModel
有一个 属性 类型 BViewModel
。 AView
创建一个在代码中创建子视图的外部函数。子视图可能如下所示:
var editText = new EditText(context);
editText.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
editText.TextSize = 40f;
var textView = new TextView(context);
textView.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
textView.TextSize = 40f;
var linearLayout = new LinearLayout(context);
linearLayout.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent);
linearLayout.AddView(editText);
linearLayout.AddView(textView);
然后将 linearLayout
添加到 AView
。当我 运行 它时,视图显示正确。
现在我需要给它添加绑定。
创建子视图的外部代码只知道BViewModel
。它不知道 AViewModel
,所以我尝试创建一个新的绑定上下文和所有者
class BindingContextOwner : IMvxBindingContextOwner
{
public BindingContextOwner(IMvxBindingContext bindingContext)
{
this.BindingContext = bindingContext;
}
public IMvxBindingContext BindingContext { get; set; }
}
var contentContext = new MvxAndroidBindingContext(this, this);
contentContext.DataContext = this.ViewModel.BViewModel;
var contentBindingOwner = new BindingContextOwner(contentContext);
其中 this
是我的 MVX 感知 activity。然后我将 contentBindingOwner 传递给我的外部代码并尝试进行绑定
var set = bindingOwner.CreateBindingSet<IMvxBindingContextOwner, BViewModel>();
set.Bind(editText).For(v => v.Text).To(vm => vm.Foo).TwoWay();
set.Bind(textView).For(v => v.Text).To(vm => vm.Foo)
set.Apply();
当我 运行 代码时,视图显示正确,但绑定不起作用。没有任何反应,我也没有看到任何可以提供帮助的日志消息。
有人知道我做错了什么吗?
编辑:现在,我觉得自己很愚蠢。我的代码工作得很好。问题是我没有看到文本视图,因为默认情况下线性布局是水平的。所以文本视图不在视图中。好吧,也许这个post可以作为参考
代码有效,问题是文本视图不在视图中。详情请见 OP!