ObservableCollection<T> in Winforms und mögliche alternativen

Winforms .net 3.5-app. In meiner app habe ich eine generische Klasse, die sieht so aus:

public class FilterItem {
  public FilterItem() { }
  public string FilterProperty { get; set; }
  public bool FilterPropertyChecked { get; set; }
  public ComparitiveOperator FilterOperator { get; set; }
  public string FilterValue { get; set; }
}

und ich verwende Sie in allen meinen Dialogfelder, wenn ich will, um zu implementieren eine Art von filter-Funktionen. So nenne ich die dialog-form mit pre-poulated List<FilterItem> übergeben im Konstruktor. Nun, wenn der dialog geladen, es iteriert durch jeden list-Element und fügt hinzu:

  1. Eine checkbox
  2. Eine combobox
  3. Eine textbox

jede Zeile in ein TableLayoutPanel. Die Checkbox bekommt seine text-Eigenschaft von FilterProperty und seine Checked-status vom FilterPropertyChecked...die Combobox erhält Ihre Bindung aus FilterOperator...und das Textfeld erhält seinen text-Wert von FilterValue.

Beachten Sie, wie Im nur sagen bekommt. Was ich möchte zu tun ist, aktualisieren Sie automatisch diese Eigenschaften, wenn Sie die Steuerelemente, deren Eigenschaften Sie gebunden sind, zu ändern. Ich hörte ObservableCollection<T> aber ich nicht zu haben scheinen "Zugriff", um es in Winforms nach dem hinzufügen der System.Collections.ObjectModel namespace.

Was wäre der beste Weg, dies zu erreichen. BindingList mit INotifyPropertyChanged?? Ich bin nicht ein Experte mit der letzteren, und wäre dankbar ein paar Tipps - wenn das der Weg ich sollte gehen.

thank u!

EDIT:

Ok, lassen Sie mich nach einigen code zu zeigen, was ich glaube, was ich tun sollte :). Ich weiß, ich brauche zu implementieren INotifyPropertyChanged auf meine FilterItem Klasse, so (nur für die FilterValue Teil zum Beispiel):

public class FilterItem : INotifyPropertyChanged {
    public FilterItem() { }
    public string FilterProperty { get; set; }
    public bool FilterPropertyChecked { get; set; }
    public ComparitiveOperator FilterOperator { get; set; }

    private string _FilterValue;
    public string FilterValue {
        get { return this._FilterValue; }
        set {
            if (this._FilterValue != value) {
                this._FilterValue = value;
                this.OnFilterValueChanged();
            }
        }
    }

    #region INotifyPropertyChanged Members
    protected void OnFilterValueChanged() {
        var handler = this.PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs("FilterValue"));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

Nun sollte alle kommen zusammen in meinem Form_Load (dies ist nur für die Textbox-Teil und die ich ausgelassen habe, die Checbox und ComboBox) etwa so:

private List<FilterItem> FilterList; //<-- this gets assigned to in the constructor

private void dlgFilterData_Load(object sender, EventArgs e) {
    foreach (FilterItem item in FilterList) {
        txt = new TextBox();
        txt.DataBindings.Add("Text", item, "FilterValue", false, DataSourceUpdateMode.OnPropertyChanged);
        txt.Dock = DockStyle.Fill;
    }
}

dem Textfeld des databindings-Datenquelle ist der FilterItem "Artikel". Aber jetzt scheint es ein problem mit meinem visual studio-IDE, so nicht, dies auszuprobieren, aber wenn ich es zum laufen. Was ich gerne wissen würde ist jetzt: wird das setup erfolgreich zu unterstützen, damit Sie meine individuelle FilterItems bekommen automatisch aktualisiert, wenn Ihre zugeordneten Steuerung der jeweiligen Eigenschaft ändert??

Sollte ich auch mit BindingList<FilterItems> statt einer ordentlichen Liste<FilterItems>?

InformationsquelleAutor Shalan | 2009-11-23

Schreibe einen Kommentar