我在我的项目中使用了一些其他MVVMLight绑定,但它们没有问题,但现在我似乎无法通过这个。
在 OnCreateView 上膨胀 Fragment 之后,我保存了一堆我要绑定的控件:一些是LinearLayouts(我想根据VM的隐藏)我想将字符串绑定到。
在我搜索这个问题的解决方案时,我偶然发现了一个人说,当OnCreateView结束时View可能不会被夸大,所以我对该控件的引用可能是错误的/ null /不对。因此,我将我的setBinding表达式移动到OnActivityCreated方法,至少“给它一点时间”。另外,根据有人建议,我的观点是 Fragment 中的所有公共属性。
pluginCodeLayoutBinding = this.SetBinding(
() => ViewModel.CreateMode,
() => pluginCodeLayout.Visibility,
BindingMode.OneWay).ConvertSourceToTarget(Converters.BoolToVisibilityReverseConverter);
pluginCodeBinding = this.SetBinding(
() => ViewModel.Script,
() => pluginCode.Text,
BindingMode.OneWay);
这些绑定提供以下例外情况:
System.InvalidOperationException:找不到属性:可见性 System.InvalidOperationException:找不到属性:文本
但是当执行中断异常时,我能够检查pluginCodeLayout并看到它具有Visibility属性,并带有默认值。
任何帮助都将不胜感激。
提前致谢!
答案 0 :(得分:4)
原始绑定不起作用的原因是pluginCode是一个字段而不是属性。如果你看一下Mvvm Light的Flowers示例,所有控件都有这样的属性。
private TextView _pluginCode;
public TextView PluginCode
{
get
{
return _pluginCode ?? (_pluginCode = View.FindViewById<TextView>(Resource.Id.plugin_code)); }
}
}
如果您这样做,那么您可以使用绑定,例如使用
this.SetBinding(() => ViewModel.Script, () => PluginCode.Text);
如果您不想拥有房产,那么您可以这样做
var pluginCode = View.FindViewById<TextView>(Resource.Id.plugin_code);
this.SetBinding(() => ViewModel.Script, pluginCode, () => pluginCode.Text);
答案 1 :(得分:2)
我的团队以前遇到过类似的事情,为了让它发挥作用,你可以改变两件事:
SetBinding
直接在您之前提取的UI元素(EditText或类似的)ViewModelLocator
,可以从您的App.cs访问)我们没有时间深入挖掘正确的解释(实现不是正确的),正如所说,以前的点在代码中转化为类似的东西:
var pluginCode = view.FindViewById<EditText>(Resource.Id.PluginCode);
pluginCode.SetBinding(
() => App.Locator.MyViewModel.SomeStringProperty,
() => pluginCode.Text,
BindingMode.TwoWay);
如果您不再需要它们,请不要忘记删除绑定。