0

我有一个 ComboBox,我已经创建了一个与项目列表的绑定,但是当我尝试绑定所选项目属性时,它什么也没做。当我只绑定 SelectedValueProperty 时,它曾经工作过。该类已经实现了 INotifyPropertyChanged。

 public void ComboBoxBinding() {
      Dictionary<long, string> myDictionary = new Dictionary<long, string>
      Control control = new ComboBox();
      comboBoxControl = (ComboBox)control;
      comboBoxControl.SetBinding(ComboBox.ItemsSourceProperty, createFieldBinding("myDictionary"));
      comboBoxControl.DisplayMemberPath = "Value";
      comboBoxControl.SelectedValuePath = "Key";
      binding = createFieldBinding(fieldProperty);
      control.SetBinding(ComboBox.SelectedItemProperty, createFieldBinding("fieldProperty")); // <-- This doesn't seem to bind.
 }

 private Binding createFieldBinding(string propertyName) {
      Binding binding = new Binding(fieldName);
      binding.Source = this.DataContext;
      binding.UpdateSourceTrigger = System.Windows.Data.UpdateSourceTrigger.PropertyChanged;

 return binding;
 }

我设置了一个可以更改字典变量的函数,并且 ComboBox 中的值会更改,但我无法更改 SelectedValueProperty。我怎么做?

编辑:如果我创建字典并手动设置 ItemsSource,它可以工作,但是当我设置绑定时,它不会。

 Dictionary<long, string> myDictionary = new Dictionary<long, string>();
 myDictionary.Add(1, "test1");
 myDictionary.Add(2, "test2");
 myDictionary.Add(3, "test3");
 myDictionary.Add(4, "test4");
 myDictionary.Add(5, "test5");
 myDictionary.Add(6, "test6");
 myDictionary.Add(7, "test7");
 myDictionary.Add(8, "test8");
 myDictionary.Add(9, "test9");
 myDictionary.Add(10, "test10");
 comboBoxControl.ItemsSource = myDictionary; //<-- This works, but if I use Binding instead of manually setting the ItemsSource, it does not work
4

2 回答 2

0
    public partial class MainWindow : Window, INotifyPropertyChanged
{
    public long SelectedValue { get { return selectedValue; } set { selectedValue = value; Notify("SelectedValue"); } }
    private long selectedValue;
    private Dictionary<long, string> myDictionary;
    public Dictionary<long, string> MyDictionary { get { return myDictionary; } set { myDictionary = value; Notify("MyDictionary"); } }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        ComboBoxBinding();
        MyDictionary = new Dictionary<long, string>() { { 1, "abc" }, { 2, "xyz" }, { 3, "pqr" } };
        SelectedValue = 2;

    }
    public void ComboBoxBinding()
    {
        Control control = new ComboBox();
        comboBoxControl = (ComboBox)control;
        comboBoxControl.SetBinding(ComboBox.ItemsSourceProperty, createFieldBinding("MyDictionary"));
        comboBoxControl.DisplayMemberPath = "Value";
        comboBoxControl.SelectedValuePath = "Key";
       comboBoxControl.SetBinding(ComboBox.SelectedValueProperty, createFieldBinding("SelectedValue"));
    }

    private Binding createFieldBinding(string fieldName)
    {
        Binding binding = new Binding(fieldName);
        binding.Source = this.DataContext;
        binding.UpdateSourceTrigger = System.Windows.Data.UpdateSourceTrigger.PropertyChanged;
        return binding;
    }
    private void Notify(string propName)
    {
        if(PropertyChanged!=null)
            PropertyChanged(this,new PropertyChangedEventArgs(propName));
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

您只能绑定属性。字段不能绑定。我希望这会有所帮助。

于 2012-08-10T17:44:44.250 回答
0

它没有绑定的原因是因为我直接在 ViewModel 中定义字典,而不是创建临时字典并将其设置为实现 INotifyPropertyChanged 的​​属性,这会阻止绑定识别成员和属性之间的链接必然。

而不是这样做:

 private Dictionary<long, string> _myList = new Dictionary<long, string>();
 public Dictionary<long, string> MyList {
      get { return _myList; }
      set { _myList = value;
            PropertyChanged("MyList"); }
 }

 public void Init() {
      _myList.Add(1, "One");
 }

我必须设置一个临时字典并将其应用于属性。

 private Dictionary<long, string> _myList = new Dictionary<long, string>();
 public Dictionary<long, string> MyList {
      get { return _myList; }
      set { _myList = value;
            PropertyChanged("MyList"); }
 }

 public void Init() {
      Dictionary<long, string> tempList = new Dictionary<long, string>();
      tempList.Add(1, "One");
      MyList = tempList;
 }
于 2012-08-13T11:51:02.060 回答