0

私はデータバインディングを WPF で動作させることに 1 週​​間強取り組んできました。ここで DataContext に関して貴重な助けを得て、DependencyProperties を介してデータバインディングを機能させました。INotifyPropertyChangedデータ バインディングについて学習しているときに、多くの点で DP よりも優れていることについて、多数の議論に出くわしました。私はそれを試してみることにしました。

Josh Smith の基本 ViewModel クラスを使用しており、ViewModel はそこから派生しています。ただし、データバインディングを機能させるのに少し問題があります。どこが間違っているのか、ここの誰かが教えてくれることを願っています。

私のViewModelクラスには、ObservableCollection<string>. 私の GUI には、この OC にバインドされたコンボボックスがあります。

<ComboBox ItemsSource="{Binding PluginNames}" />

GUI の DataContext は ViewModel に設定されます。

private ViewModel _vm;

public GUI()
{
  InitializeComponent();
  _vm = new ViewModel();
  this.DataContext = _vm;
}

ViewModel には「PluginNames」という名前の OC があります。

public class ViewModel
{
  public ObservableCollection<string> PluginNames;  // this gets instantiated and added to elsewhere
}

GUI がロードされると、OC をインスタンス化し、それにプラグイン名を追加するメソッドが呼び出されます。OC が変更された後、私は を呼び出しますRaisePropertyChanged( "PluginNames")。WPF データバインディング モデルは INotifyPropertyChanged を認識しているため、これだけで「魔法のように動作」し、ロードされたプラグインでコンボボックス項目が更新されることを期待していましたが、そうではありません。

誰かが私がここで間違ったことを指摘できますか? ありがとう!

更新:理由はわかりませんが、明らかな更新を行わない代わりに、プロパティがまったく見つかりません。私は本当に愚かで、どこかで重要なステップを逃していると思います.

4

2 に答える 2

6

で作業しているときはINotifyPropertyChanged、次の 2 つがあります。

  1. フィールドではなく、プロパティを使用する必要があります
  2. プロパティを設定するときは、常にプロパティ変更イベントを発生させる必要があります。

これを次のように作り直す必要があります。

private ObservableCollection<string> pluginNames;
public ObservableCollection<string> PluginNames
{
    get { return pluginNames; }
    set {
        this.pluginNames = value;
        RaisePropertyChanged("PluginNames"); // This should raise the PropertyChanged event - use whatever your VM class does for this
    }
}

これにより、すべてが再設定されるはずです。

于 2009-12-29T19:54:02.647 に答える
4

プロパティではなくフィールドを公開したようです。バインディングはプロパティに対してのみ機能します...次のように変更します。

public class ViewModel
{
  public ObservableCollection<string> PluginNames {get; private set;} 
}
于 2009-12-29T19:51:26.660 に答える