我尝试使用 ReactiveUI 中的 IReactiveBinding 将版本从视图模型绑定到控件的属性,版本 6.5.0.0 < /强>
我想将视图模型中的否定值绑定到控件的属性:
this.Bind(ViewModel, vm => !vm.IsSmth, control => _checkBoxSmth.Enabled, _checkBoxSmth.Events().CheckStateChanged)
但我刚收到此错误,无法找到解决方法。
System.NotSupportedException: Unsupported expression type: 'Not' caught here:
有什么建议吗?
答案 0 :(得分:2)
问题的根源是Bind
仅允许vmProperty
和viewProperty
参数中的属性 - 您无法通过函数调用更改它们。如果您不想更改视图模型,可以使用接受IBindingTypeConverter
的Bind
重载,这将简单地否定您的布尔值。以下是BooleanToVisibilityTypeConverter
实施的示例。
您的代码可能如下所示(注意 - 我没有测试它):
public class NegatingTypeConverter : IBindingTypeConverter
{
public int GetAffinityForObjects(Type fromType, Type toType)
{
if (fromType == typeof (bool) && toType == typeof (bool)) return 10;
return 0;
}
public bool TryConvert(object from, Type toType, object conversionHint, out object result)
{
result = null;
if (from is bool && toType == typeof (bool))
{
result = !(bool) from;
return true;
}
return false;
}
}
请注意,如果使用OneWayBind
,则不需要实现自己的转换器,有重载接受功能改变视图模型属性(查找selector
参数)。
答案 1 :(得分:0)
我的建议是你添加一个负数字段并绑定到该字段 这是一个非常简单的概念示例。
public class Model
{
public bool IsSmth { get; set; }
public bool IsNotSmth
{
get { return !IsSmth; }
set { IsSmth = value; }
}
}
然后像这样绑定。
this.Bind(ViewModel, vm => vm.IsNotSmth, control => _checkBoxSmth.Enabled, _checkBoxSmth.Events().CheckStateChanged)