【问题标题】:Combobox not displaying changing values组合框不显示变化的值
【发布时间】:2013-04-17 14:39:43
【问题描述】:

我遇到了一个奇怪的 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 没有影响!

我错过了什么?

【问题讨论】:

  • 设置 SelectedItem 双向绑定模式
  • 不会改变任何东西。将 updatesourcetrigger 设置为 propertychanged 也无济于事。请不要猜测:)
  • 您能否提供具有 Items 属性的类的详细信息(使用 )? (问是不想猜)。
  • 添加到我的初始帖子中
  • 您正在绑定到列表而不是 ObservalbeCollection。请展示你如何在视图模型中获得价值?

标签: c# wpf combobox


【解决方案1】:

设置SelectedItem双向绑定模式

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

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

【讨论】:

  • 我没有问题将 itemsource 绑定到我的组合框。
  • 如果您将答案更改为:“将 GetNames 更改为 GetValues”,我将接受您的回答。另一方面,将枚举转换为字符串,反之亦然是无稽之谈!
【解决方案2】:

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

        }

【讨论】:

  • 考虑阅读我的实际问题。我知道如何绑定组合框。
  • 但是用这种方法,你就不会有麻烦了……这就是我说的(写作)
  • 你正在做一些完全不同的事情。你有本地化问题。你也根本不更新视图模型的值..
  • 如果我想更改 ViewModel 的值,我只需将 SelectedTraceType 分配给一个值,raisePropertyChange 将引发并更新我的 UI
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2013-03-18
相关资源
最近更新 更多