0

コード ビハインドで ObservableCollection にバインドされているコンボボックスがある小さな WPF アプリケーションに取り組んでいます。

public Molecule CurrentMolecule { get; set; }
public ObservableCollection<string> Formulas { get; set; }

public MainWindow()
{
     CurrentMolecule = new Molecule();
     Formulas = new ObservableCollection<string>(CurrentMolecule.FormulasList.ToList());
     DataContext = this;

     InitializeComponent();
}

<ComboBox x:Name="cmbFormula" ItemsSource="{Binding Path=Formulas}" SelectionChanged="cmbFormula_SelectionChanged"/>

これは、コンボ ボックスに を入力するのに問題なく機能しますが、CurrentMolecule.FormulasListある時点CurrentMoleculeで Molecule の新しいインスタンスに設定すると、データバインディングが機能しなくなります。OnPropertyChanged イベントを実装して、コンボ ボックスの内容が何であれ最新の状態を維持する必要がありCurrentMolecule.FormulasListますか?

4

2 に答える 2

2

を実装する必要がINotifyPropertyChangedあります。そうしないと、UI で変更が更新されません。

これが私があなたのコードに加えた変更です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private Molecule _CurrentMolecule;

        public Molecule CurrentMolecule
        {
            get
            {
                return _CurrentMolecule;
            }
            set
            {
                _CurrentMolecule = value;
                OnPropertyChanged("CurrentMolecule");
                Formulas =  new ObservableCollection<string>(CurrentMolecule.FormulasList.ToList());
            }
        }

        private ObservableCollection<string> _Formulas;

        public ObservableCollection<string> Formulas
        {
            get { return _Formulas; }
            set
            {
                _Formulas = value;
                OnPropertyChanged("Formulas");
            }
        }

        public MainWindow()
        {
            InitializeComponent();

            CurrentMolecule = new Molecule();
            DataContext = this;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

編集:より良いアプローチは、ViewModel を作成し、それを の DataContext にバインドすることWindowです。

以下のように呼ばれる新しいクラスを定義ViewModelします。名前空間を変更したい場合があることに注意してください

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
    public class ViewModel : INotifyPropertyChanged
    {
        #region Properties
        private Molecule _CurrentMolecule;
        public Molecule CurrentMolecule
        {
            get
            {
                return _CurrentMolecule;
            }
            set
            {
                _CurrentMolecule = value;
                OnPropertyChanged("CurrentMolecule");
                Formulas = new ObservableCollection<string>(CurrentMolecule.FormulasList.ToList());
            }
        }

        private ObservableCollection<string> _Formulas;
        public ObservableCollection<string> Formulas
        {
            get { return _Formulas; }
            set
            {
                _Formulas = value;
                OnPropertyChanged("Formulas");
            }
        }
        #endregion

        #region Constructor
        public ViewModel()
        {
            CurrentMolecule = new Molecule();
        }
        #endregion

        #region INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}

MainWindowコード ビハインド ファイルを次のように変更します。

public MainWindow()
{
    InitializeComponent();

    DataContext = new ViewModel();
} 
于 2013-01-30T17:14:34.640 に答える
0

おそらく、WPF コントロールのデータコンテキストの基礎が欠けています。{Binding CurrentMolecule.FormulasList} のようなバインディングを使用している場合、または親コントロールのデータ コンテキストが「CurrentMolecule」にバインドされている場合、その項目の DataContext を交換すると、バインディングがリセットされます。親データコンテキストが変更された場合でも、データコンテキストを FormulasList にバインドしたままにしたい場合。そのコンテキストを FormulasList プロパティに直接バインドし、ViewModel でそのインスタンスが変更された場合でも、他の親コントロールが CurrentMolecule をデータ コンテキストとして使用していないことを確認する必要があります。

于 2013-01-30T17:13:47.750 に答える