1

在 WPF 中使用值转换器,您可以返回类似DependecyProperty.UnsetValueBinding.DoNothing作为特殊值的内容,以表示不理会绑定。MVVMCross 中是否有类似的机制?

更具体地说,我想要做什么,是我有一个视图模型属性,它是一个三态枚举,我需要绑定到 3 个二进制控件。所以我想我可以将每个控件绑定到一个MyEnum->bool转换器,该转换器将转换参数设置为转换器的值,并且在该方法中,如果状态等于参数,Convert它将返回 true,否则返回false。MyEnum到目前为止,一切都很好。但我希望这个绑定是双向的,所以我需要转换回来。我的转换回来是这样的:

    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更新我的视图模型上的绑定属性与参数相同,如果不是,则不理会视图模型属性。

也许这是使用强类型值转换器的问题?

4

2 回答 2

1

更新: UnsetValue 现在在 mvvmcross 中可用 - 所以不再需要这个答案。


Binding.DoNothing,DependencyProperty.UnsetValue或等效的当前未在 MvvmCross 绑定系统中实现,我不相信目前在此打开任何功能或拉取请求。

恐怕我不太了解您的示例-“转换参数设置为转换器的值”和if (parameter is MyEnum)代码段让我很困惑-据我所知,windows xaml 绑定中的参数是一个常量,所以我不不太明白这个例子。对不起,如果我误解了。

无论如何,可用于帮助在您的 mvx 应用程序中启动和运行此功能的一些可能方法是:


或者/另外,请考虑为这种“什么都不做”类型的功能提出功能和/或拉取请求,以包含在https://github.com/slodge/MvvmCross/blob/v3/CirriousTryGetValue的/SetValue方法中/Cirrious.MvvmCross.Binding/Bindings/SourceSteps/MvxSourceStep.cs#L66 - 但显然时间线可能会更长。

于 2013-08-29T07:21:42.890 回答
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);
}

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

于 2013-08-29T13:01:57.783 回答