2

私のプログラム(MVVM WPF)には多くの列挙型があり、列挙型をビュー内のコントロールにバインドしています。

それを行う方法はたくさんあります。

1) ComboBoxEdit(Devexpress Control) にバインドします。ObjectDataProvider を使用しています。

そして、これ

<dxe:ComboBoxEdit ItemsSource="{Binding Source={StaticResource SomeEnumValues}>

これは正常に機能しますが、TabControl ヘッダーでは機能しません。

2) それで、どちらも機能しなかった IValueConverter を使用することを考えました。

public object Convert(object value, Type targetType, object parameter, 
    CultureInfo culture)
{
    if (!(value is Model.MyEnum))
    {
        return null;
    }

    Model.MyEnum me = (Model.MyEnum)value;
    return me.GetHashCode();
}

public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
{
    return null;
}

XAML で:

<local:DataConverter x:Key="myConverter"/>

<TabControl SelectedIndex="{Binding Path=SelectedFeeType, 
      Converter={StaticResource myConverter}}"/>

3) これを行う 3 つ目の方法は、動作依存プロパティを作成することです。

このようなもの

public class ComboBoxEnumerationExtension : ComboBox
    {
        public static readonly DependencyProperty SelectedEnumerationProperty =  
          DependencyProperty.Register("SelectedEnumeration", typeof(object), 
          typeof(ComboBoxEnumerationExtension));

        public object SelectedEnumeration
        {
            get { return (object)GetValue(SelectedEnumerationProperty); }
            set { SetValue(SelectedEnumerationProperty, value); }
        }

列挙とそれにバインドするための最良の方法を知りたいです。現在、タブヘッダーを列挙型にバインドできません。

4

1 に答える 1

3

これを行うより良い方法は次のとおりです。

モデルに、このプロパティを配置します。

public IEnumerable<string> EnumCol { get; set; }

(名前は自由に変更できますが、どこでも変更することを忘れないでください)

コンストラクターでこれを使用します (または、初期化メソッドに配置することをお勧めします)。

var enum_names = Enum.GetNames(typeof(YourEnumTypeHere));
EnumCol = enum_names ;

これにより、すべての名前が取得YourEnumTypeHereされ、次のように xaml でバインドするプロパティに含まれます。

<ListBox ItemsSource="{Binding EnumCol}"></ListBox>

明らかに、ListBox である必要はありませんが、文字列のコレクションにバインドするだけで、問題は解決するはずです。

于 2013-11-03T01:51:58.687 に答える