none
IValueConverter内部でのtypeofの切り替え方法について RRS feed

  • 質問

  • 現在VS2013 C# でWPFアプリケーションを作成しています。

    下記のようなコードで、Convertメソッド内のtypeof()のenumを切り替えられるようにして、使い回ししたいのですが可能でしょうか?

    ※enumごとにConverterを作成するとConverterが大量になってしまうため。

    宜しくお願いいたします。

        public enum Gender
        {
            Male,
            Female,
            Unknown
        }
    
        public enum Sport
        {
            Football,
            Baseball,
            Swimming,
            Golf
        }
    
        public class EnumToStringConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                // ここのGenderをSportやその他のenumに切り替えたい
                return Enum.GetName(typeof (Gender), value);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    2015年12月18日 9:40

回答

  • ConverterParameterを自由にしていいなら、ConverterParameterにEnumの型を与えてやる方法が

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:app="clr-namespace:WpfApplication1" 
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <app:EnumToStringConverter x:Key="enum2string"/>
        </Window.Resources>
        <Window.DataContext>
            <sys:Int32>1</sys:Int32>
        </Window.DataContext>
        <StackPanel>
            <TextBlock Text="{Binding Path=.,Converter={StaticResource enum2string},ConverterParameter={x:Type app:Gender}}" />
            <TextBlock Text="{Binding Path=.,Converter={StaticResource enum2string},ConverterParameter={x:Type app:Sport}}" />
        </StackPanel>
    </Window>

    public class EnumToStringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Enum.GetName((System.Type)parameter,value);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク れいじ 2015年12月18日 10:51
    2015年12月18日 9:58

すべての返信

  • ConverterParameterを自由にしていいなら、ConverterParameterにEnumの型を与えてやる方法が

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:app="clr-namespace:WpfApplication1" 
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <app:EnumToStringConverter x:Key="enum2string"/>
        </Window.Resources>
        <Window.DataContext>
            <sys:Int32>1</sys:Int32>
        </Window.DataContext>
        <StackPanel>
            <TextBlock Text="{Binding Path=.,Converter={StaticResource enum2string},ConverterParameter={x:Type app:Gender}}" />
            <TextBlock Text="{Binding Path=.,Converter={StaticResource enum2string},ConverterParameter={x:Type app:Sport}}" />
        </StackPanel>
    </Window>

    public class EnumToStringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Enum.GetName((System.Type)parameter,value);
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク れいじ 2015年12月18日 10:51
    2015年12月18日 9:58
  • >gekkaさん

    回答ありがとうございます。

    できました!ConverterParameterで引数を渡すところまではいけてたのですが、(System.Type)でキャストするところがわかりませんでした。

    ありがとうございます。助かりました。

    2015年12月18日 10:51