【问题标题】:MVVMLight binding throws System.InvalidOperationException: Property not foundMVVMLight 绑定抛出 System.InvalidOperationException:找不到属性
【发布时间】:2015-04-20 11:59:53
【问题描述】:

我在我的项目中使用了其他一些 MVVMLight 绑定,它们都可以正常工作,但现在我似乎无法超越这个。

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

在寻找此问题的解决方案时,我偶然发现有人说视图可能不会随着 OnCreateView 结束而膨胀,因此我对该控件的引用可能是错误的/空的/不正确的。因此,我将 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 属性及其默认值。

任何帮助将不胜感激。

提前致谢!

【问题讨论】:

    标签: xamarin xamarin.android mvvm-light


    【解决方案1】:

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

    【讨论】:

    • 抱歉挖掘了一个旧线程。但我只是好奇,为什么不能使用字段而只能使用属性?字段不能像属性一样被读写吗?
    【解决方案2】:

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

    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);
    

    当您不再需要绑定时,不要忘记删除它们。

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2015-11-07
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多