C# 组合框不显示更改的值

C# 组合框不显示更改的值,c#,wpf,combobox,C#,Wpf,Combobox,我被困在一个奇怪的组合框问题上 我正在使用ObjectDataProvider为组合框提供数据: <ObjectDataProvider x:Key="foo" MethodName="GetNames" ObjectType="{x:Type sys:Enum}"> <ObjectDataProvider.MethodParameters> <x:Type TypeName=

我被困在一个奇怪的组合框问题上

我正在使用ObjectDataProvider为组合框提供数据:

    <ObjectDataProvider x:Key="foo" 
                    MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:FooEnum" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
SomeClass的集合绑定到带有组合框模板的ItemsControl

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

ViewModel:

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

    public List<SomeClass> Items {get; private set; }
}
公共类VM:NotifyHelper
{
公共虚拟机()
{
项目=新列表();
Add(newsomeclass{Value=Foo.X});
}
公共列表项{get;private set;}
}
我的问题:
-初始情况下,组合框未选择任何项目
-当我更改viewmodel中的值而不是视图中的值时,组合框中的值不会更新

将组合框SelectedItem的绑定更改为TwoWay和OnPropertyChange没有影响


我缺少什么?

双向设置SelectedItem绑定模式

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


是的,GetVaues将在这里完成这项工作。

下面是我用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);
          }

        }
private observedcollection\u traceDisplayList=null;
private WritableKeyValuePair _selectedTraceType=新的WritableKeyValuePair();
公共选项筛选服务模型()
{
_traceDisplayList=新的ObservableCollection();
_添加(新的WritableKeyValuePair((int)traceDisplaynum.All,ProjectResources.All));
_添加(新的WritableKeyValuePair((int)traceDisplaynum.WithEx,ProjectResources.TraceeException));
_添加(新的WritableKeyValuePair((int)TraceDisplayEnum.ExOnly,ProjectResources.ExceptionOnly));
}
/// 
///记录道类型列表
/// 
公共可见收集跟踪显示列表
{
获取{return\u traceDisplayList;}
设置
{
_traceDisplayList=值;
RaisePropertyChanged(x=>x.TraceDisplayList);
}
}
/// 
///在列表中输入跟踪选择
/// 
public WritableKeyValuePair SelectedTraceType
{
得到
{
return _selectedTraceType;
}
设置
{
_selectedTraceType=值;
RaisePropertyChanged(x=>x.SelectedTraceType);
}
}

考虑阅读我的实际任务。我知道如何绑定组合框。但是使用这种方法,您将不会遇到麻烦。。。这就是我在说(写)你在做完全不同的事情。您在本地化方面有问题。此外,您也根本不更新viewmodel中的值。如果我要更改viewmodel中的值,我只需将SelectedTraceType分配给一个值,raisePropertyChange将引发并更新我的UII。我没有问题将itemsource绑定到我的组合框。如果您将答案更改为:“将GetNames更改为GetValue”我会接受你的回答。另一方面,将枚举转换为字符串以及将枚举转换为字符串都是胡说八道!将SelectedItem绑定模式设置为Twoway不会更改任何内容。此外,将updatesourcetrigger设置为propertychanged也没有帮助。请不要猜测:)您能提供拥有Items属性(已使用)的类的详细信息吗?(以不想猜测的方式提问)。添加到我的初始帖子中,您绑定到的是一个列表,而不是一个可观察的集合。请说明如何在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);
          }

        }