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 并看到它具有默认值的可见性 属性。
如有任何帮助,我们将不胜感激。
提前致谢!
我的团队以前遇到过类似的事情,您可以更改两件事以使其正常工作:
SetBinding
直接在您之前获取的 UI 元素(EditText 或类似元素)中
- 静态访问您的视图模型(因为您已经在使用 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);
我在我的项目中使用了其他一些 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 并看到它具有默认值的可见性 属性。
如有任何帮助,我们将不胜感激。
提前致谢!
我的团队以前遇到过类似的事情,您可以更改两件事以使其正常工作:
SetBinding
直接在您之前获取的 UI 元素(EditText 或类似元素)中- 静态访问您的视图模型(因为您已经在使用 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);