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

バインドされていなかった理由は、一時的な Dictionary を作成して INotifyPropertyChanged を実装する Property に設定するのではなく、ViewModel で Dictionary を直接定義していたためです。に縛られていました。

代わりに:

 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 に答える