MVVMLight绑定抛出System.InvalidOperationException:找不到属性

时间:2015-04-20 11:59:54

标签: xamarin xamarin.android mvvm-light

我在我的项目中使用了一些其他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属性,并带有默认值。

任何帮助都将不胜感激。

提前致谢!

2 个答案:

答案 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)

我的团队以前遇到过类似的事情,为了让它发挥作用,你可以改变两件事:

  1. SetBinding直接在您之前提取的UI元素(EditText或类似的)
  2. 静态访问您的视图模型(因为您已经使用MVVM Light,我假设您已经有ViewModelLocator,可以从您的App.cs访问)
  3. 我们没有时间深入挖掘正确的解释(实现不是正确的),正如所说,以前的点在代码中转化为类似的东西:

    var pluginCode = view.FindViewById<EditText>(Resource.Id.PluginCode);
    pluginCode.SetBinding(
         () => App.Locator.MyViewModel.SomeStringProperty,
         () => pluginCode.Text,
     BindingMode.TwoWay);
    

    如果您不再需要它们,请不要忘记删除绑定。

相关问题