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

MVVMLight binding throws System.InvalidOperationException: Property not found

我在我的项目中使用了其他一些 MVVMLight 绑定,它们工作没有问题,但现在我似乎无法通过这个。

在其 OnCreateView 上膨胀 Fragment 后,我保存了一堆我想绑定的控件:一些是 LinearLayouts(谁我想根据 VM 的 属性) 隐藏,有些是我想绑定字符串的 TextViews。

在寻找此问题的解决方案时,我偶然发现有人说 View 可能不会在 OnCreateView 结束时膨胀,所以我对该控件的引用可能是 wrong/null/not 正确的。因此,我将我的 setBinding 表达式移动到 OnActivityCreated 方法至少 "give it a little more time"。另外,根据某人的建议,我的观点都是 Fragment.

中的所有 public 属性
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 并看到它具有默认值的可见性 属性。

如有任何帮助,我们将不胜感激。

提前致谢!

我的团队以前遇到过类似的事情,您可以更改两件事以使其正常工作:

  1. SetBinding 直接在您之前获取的 UI 元素(EditText 或类似元素)中
  2. 静态访问您的视图模型(因为您已经在使用 MVVM Light,我假设您已经有一个 ViewModelLocator,可以从您的 App.cs 访问它)

我们没有时间深入挖掘以获得正确的解释(实施不正确),也就是说,前面的观点在代码中转化为与此类似的内容:

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

不要忘记删除不再需要的绑定。

原始绑定不起作用的原因是 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);