如何设置绑定到字典的组合的SelectedValue

时间:2014-07-29 13:27:39

标签: c# wpf dictionary combobox

我想将字典绑定到组合框 我的代码就是这个(这里我简化了一点)

public class MyObject
{
  private AnotherObject _obj;

  public MyObject() { }

  public MyObject(AnotherObject obj)
  {
    _obj = obj;
  }

  public string ObjType
  {
    get { return (_obj != null ? _obj.GetType() : "NO OBJECT" ); }
  }

  public string ObjString
  {
    get { return (_obj != null ? _obj.ToString() : "NO OBJECT" ); }
  }

}


public class MyClass 
{    
  private Dictionary<string, MyObject> _BindingButtons;

  public MyClass() 
  {
    _BindingButtons["KEY_1"] = new MyObject( CreateAnotherObject() );
    _BindingButtons["KEY_2"] = new MyObject( CreateAnotherObject() );
    ...
    ...
  }

  public Dictionary<string, MyObject> BindingButtons
  {
    get { return _BindingButtons; }      
  }    

}

现在,在我写的xaml中

<ComboBox ItemsSource="{Binding BindingButtons}"
          DisplayMemberPath="ObjString"
          SelectedValuePath="KEY_1"
          SelectedValue="{Binding ???? }"/>

我有两个问题

  • 组合列表为空(字典不为空)
  • 有没有办法将SelectedValue绑定到类似的东西:

    “{Binding BindingButtons [KEY_1]}”

    没有为每个组合创建属性?

哪里错了?
问候。

[编辑]

关于我在SelectedValue上的问题...

假设有10个具有相同ItemsSource的组合。现在,不是写10个属性(每个组合一个),有没有办法写这样的东西(处理SelectedItem):

class Test
{
  private string[] _Items = new string[10];

  public string GetItem(int index)
  {
    return _Items[index];
  }

  public void SetItem(int index, string value)
  {
    _Items[index] = value;
  }
}

1 个答案:

答案 0 :(得分:0)

Dictionary有一个集合属性Values,您可以在这里使用

根据您的数据模型,这应该可行

<ComboBox ItemsSource="{Binding BindingButtons.Values}"
          DisplayMemberPath="ObjString"
          SelectedItem="{Binding SelectedItemInVM}"/>

我在你的问题中不确定SelectedValue的用途,我在例子中用SelectedItem替换它,你可以根据你的需要进行调整。

修改

回答你的编辑

您有两个选项可以将单个组合框绑定到数组

但在此之前你需要将数组字段转换为公共属性并相应地初始化,否则绑定可能会失败

public string[] Items { get; set; }

然后使用索引器Items[0]等进行绑定。

<ComboBox ItemsSource="{Binding BindingButtons.Values}"
          DisplayMemberPath="ObjString"
          SelectedValuePath="ObjType"
          SelectedValue="{Binding Items[0]}"/>

或创建MyObject类型

的数组
public MyObject[] Items { get; set; }

并且绑定保持相同,但使用SelectedItem属性而不是SelectedValue

<ComboBox ItemsSource="{Binding BindingButtons.Values}"
          DisplayMemberPath="ObjString"
          SelectedItem="{Binding Items[0]}"/>

确保在构造函数Items = new string[10];Items = new MyObject[10];中初始化数组10是您拥有的组合数