返回值转换器中的未设置值

时间:2013-08-28 19:00:11

标签: mvvmcross

在WPF中使用值转换器,您可以返回DependecyProperty.UnsetValueBinding.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属性更新为与参数相同,否则,请保留视图单独的模型属性。

使用强类型值转换器可能是这个问题吗?

2 个答案:

答案 0 :(得分:1)

更新:现在可以在mvvmcross中使用UnsetValue - 因此不再需要此答案。


目前尚未在MvvmCross绑定系统中实现

Binding.DoNothingDependencyProperty.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.csTryGetValue / 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);
}

这不是一般解决方案,但它符合我的迫切需要。