0

奇妙な ComboBox の問題で立ち往生しています。

私は ObjectDataProvider を使用してコンボボックスにフィードしています:

    <ObjectDataProvider x:Key="foo" 
                    MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:FooEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

今、私は次のようなクラスを持っています:

public class SomeClass : NotifyHelper
{
    private FooEnum _value;

    public FooEnum Value
    {
        get { return _value; }
        set
        {
            _value = value;
            OnPropertyChanged("Value");
        }
    }
}

SomeClass のコレクションは、コンボ ボックス テンプレートを使用して ItemsControl にバインドされます。

        <ItemsControl ItemsSource="{Binding Items}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Source={StaticResource foo}}" SelectedItem="{Binding Value}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

ビューモデル:

public class VM : NotifyHelper
{
    public VM ()
    {
        Items = new List<SomeClass>();
        Items.Add(new SomeClass{Value = Foo.X});
    }

    public List<SomeClass> Items {get; private set; }
}

私の問題:
- 最初はコンボボックスにアイテムが選択されていません
- ビューではなくビューモデルで値を変更すると、値はコンボボックスで更新されません。

ComboBox SelectedItem のバインディングを TwoWay および OnPropertyChange に変更しても影響はありません!

私は何が欠けていますか?

4

2 に答える 2

1

SelectedItem バインディング モードを双方向に設定する

SelectedItem="{Binding Value, Mode=TwoWay}"

ええ、GetVaues がここで仕事をします。

于 2013-04-17T14:51:29.063 に答える
0

MVVMで列挙値をコンボボックスにフィードするために私がすることは次のとおりです

私のViewModelのコンストラクターにはこれがあり、値(文字列)をリソースファイルに入れます

private ObservableCollection<WritableKeyValuePair<int, string>> _traceDisplayList = null;
private WritableKeyValuePair<int, string> _selectedTraceType = new WritableKeyValuePair<int, string>();


public OptionsFilterViewModel()
{
       _traceDisplayList = new ObservableCollection<WritableKeyValuePair<int, string>>();
       _traceDisplayList.Add(new WritableKeyValuePair<int, string>((int)TraceDisplayEnum.All, ProjectResources.All));
       _traceDisplayList.Add(new WritableKeyValuePair<int, string>((int)TraceDisplayEnum.WithEx, ProjectResources.TraceException));
       _traceDisplayList.Add(new WritableKeyValuePair<int, string>((int)TraceDisplayEnum.ExOnly, ProjectResources.ExceptionOnly));

}

    /// <summary>
        /// Listes des types de traces
        /// </summary>
        public ObservableCollection<WritableKeyValuePair<int, string>> TraceDisplayList
        {
          get { return _traceDisplayList; }
          set
          {
            _traceDisplayList = value;
            RaisePropertyChanged<OptionsFilterViewModel>(x => x.TraceDisplayList);
          }
        }

        /// <summary>
        /// Type de trace sélectionné dans la liste
        /// </summary>
        public WritableKeyValuePair<int, string> SelectedTraceType
        {
          get
          {
            return _selectedTraceType;
          }
          set
          {
            _selectedTraceType = value;
            RaisePropertyChanged<OptionsFilterViewModel>(x => x.SelectedTraceType);
          }

        }
于 2013-04-17T15:08:18.163 に答える