ValueWhenConverter和Enum

时间:2017-04-22 16:28:26

标签: template10

如何将ValueWhenConverter与枚举一起使用?

例如:

<Grid Visibility="{x:Bind ViewModel.ViewModelStatus, Mode=OneWay, Converter={StaticResource ViewStatusConverter}}">
..
</Grid>

<converters:ValueWhenConverter x:Key="ViewStatusConverter">
            <converters:ValueWhenConverter.When>
                <vm:ViewModelStates>Error</vm:ViewModelStates>
            </converters:ValueWhenConverter.When>
            <converters:ValueWhenConverter.Value>
                <Visibility>Visible</Visibility>
            </converters:ValueWhenConverter.Value>
            <converters:ValueWhenConverter.Otherwise>
                <Visibility>Collapsed</Visibility>
            </converters:ValueWhenConverter.Otherwise>
        </converters:ValueWhenConverter>

我认为这种语法不正确:<vm:ViewModelStates>Error</vm:ViewModelStates>

如何将ValueWhenConverter映射到我的枚举值?

1 个答案:

答案 0 :(得分:0)

不幸的是,当OfValueConverter无法映射到枚举时,我尝试使用它:

<converter:ValueWhenConverter x:Key="EnumSexToBooleanConverter">
        <converter:ValueWhenConverter.When>
            <vm:RegisterPageViewModel>
                <vm:RegisterPageViewModel.PersonalInfo>
                    <model:Personal>
                        <model:Personal.Sex>
                            0
                        </model:Personal.Sex>
                    </model:Personal>
                </vm:RegisterPageViewModel.PersonalInfo>
            </vm:RegisterPageViewModel>
        </converter:ValueWhenConverter.When>
        <converter:ValueWhenConverter.Value>
            <ToggleSwitch>
                <ToggleSwitch.IsOn>
                    <x:Boolean>True</x:Boolean>
                </ToggleSwitch.IsOn>
            </ToggleSwitch>
        </converter:ValueWhenConverter.Value>
        <converter:ValueWhenConverter.Otherwise>
            <ToggleSwitch>
                <ToggleSwitch.IsOn>
                    <x:Boolean>False</x:Boolean>
                </ToggleSwitch.IsOn>
            </ToggleSwitch>
        </converter:ValueWhenConverter.Otherwise>
    </converter:ValueWhenConverter>

并抛出一个InvalidCast异常,它在使用值类型时是一个很好的转换器,例如x:Boolean,x:Int32,x:Double和x:String,它也有一些枚举值集成在xaml中,如可见性使用Visible和Collapsed等枚举的属性。

就我现在的尝试而言,我甚至尝试了许多不同的方式,没有办法使用带枚举的WhenValueConverter。

如果您需要从布尔值转换为枚举,反之亦然,我建议您使用IValueConverter创建自己的转换器。

这将是您实际问题的最佳选择。

此外,如果您希望能够将WhenValueConverter映射到枚举值,可以通过将viewmodel属性更改为依赖属性来实现,如下所示:

public Gender Sex
{
 get { return (Gender)GetValue(SexProperty); }
 set { SetValue(SexProperty, value); }
}

public static readonly DependencyProperty SexProperty = 
 DependencyProperty.Register(
     nameof(Sex), typeof(Gender),
     typeof([YourContainerType]),
     new PropertyMetadata([initial_default_or_null_here])
 );
}

public enum Gender : int
{
  Female,
  Male
}

这只是一个例子,来自Template 10 github项目的这个示例dg2k的作者。 Template 10 - WhenValueConverter to Enum Values