在WPF中使用值转换器,您可以返回DependecyProperty.UnsetValue
或Binding.DoNothing
之类的特殊值来表示单独保留绑定。 MVVMCross中是否有类似的机制?
为了更具体地说明我正在尝试做什么,我是否有一个视图模型属性,它是一个三态枚举,我需要绑定到3个二进制控件。所以我想我可以将每个控件绑定到MyEnum
- > bool
转换器将转换参数设置为转换器的值,并且在Convert
方法中,如果MyEnum
状态等于参数,则返回true,否则返回false。到现在为止还挺好。但我希望这种绑定是双向的,所以我需要转换回来。我的转换回来是这样的:
protected override MyEnum ConvertBack(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter is MyEnum)
{
if (value)
{
return (MyEnum)parameter; // this is fine
}
else
{
return ???
}
}
return base.ConvertBack(value, targetType, parameter, culture);
}
基本上,我希望能够做的是,如果我的控件状态为true
,则将我的视图模型上的bound属性更新为与参数相同,否则,请保留视图单独的模型属性。
使用强类型值转换器可能是这个问题吗?
答案 0 :(得分:1)
更新:现在可以在mvvmcross中使用UnsetValue - 因此不再需要此答案。
Binding.DoNothing
,DependencyProperty.UnsetValue
或同等效果,而且我不相信目前有任何feature or pull requests已开启。
我担心我不能理解你的例子 - 将转换参数设置为转换器的值'并且if (parameter is MyEnum)
片段反而让我 - 据我所知,windows xaml绑定中的参数是一个常量,所以我不太明白这个例子。对不起,如果我误解了。
无论如何,一些可能用于帮助您在mvx应用中启动并运行此功能的方法是:
您可以从ValueConverter中抛出异常:
Convert
方向,如果ValueConverter失败(抛出异常),则使用绑定FallbackValue
ConvertBack
方向,如果抛出异常,绑定不会执行任何操作(尽管不幸的是会产生一些跟踪"错误"每次输出)您可以为您的控件实现自定义绑定 - 只有在您感兴趣的更改时才触发更改更新(某些自定义绑定在http://mvvmcross.wordpress.com中的N = 28中引入,这会创建绑定与BinaryEditFooTargetBinding.cs类似 - 在该类中自定义/过滤TargetOnMyCountChanged
行为是直截了当的)
您可以实现一个自定义二进制控件 - 只有在您感兴趣的更改时才会触发更改更新(对于各种平台,某些自定义控件在N = 18到N = 20中引入{{3 }})
您可以实现ViewModel二进制属性,这些属性镜像您的View并映射到您的三个状态枚举
你可以在西藏绑定系统中使用http://mvvmcross.wordpress.com - 基于类似ValueCombiner
LI>另外/另外,请同时考虑提出功能和/或拉取请求,以便“不做任何事”' MvxSingleValueCombiner.cs中TryGetValue
/ SetValue
方法中包含的功能类型 - 但显然时间轴可能会更长。
答案 1 :(得分:1)
如果有其他人遇到类似的问题,除了斯图尔特的建议外,这就是我实际上最终要做的事情。
在视图模型中
private MyEnum _selectedValue = MyEnum.SomeValue;
public MyEnum ? SelectedValue
{
get
{
return _selectedTab;
}
set
{
if (value.HasValue)
{
_selectedTab = value.Value;
RaisePropertyChanged(() => SelectedTab);
}
}
}
然后在我的转换器中(现在为MvxValueConverter<MyEnum?, bool>
):
protected override MyEnum? ConvertBack(bool value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter is MyEnum) // this is just a sanity check
{
if (value)
{
return (MyEnum)parameter;
}
else
{
return null
}
}
return base.ConvertBack(value, targetType, parameter, culture);
}
这不是一般解决方案,但它符合我的迫切需要。