ObservableCollection <T> w Winforms i możliwe alternatywy
Aplikacja Winforms .net 3.5. W mojej aplikacji mam klasę ogólną, która wygląda tak:
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; }
}
i używam go we wszystkich moich oknach dialogowych, gdy chcę zaimplementować jakąś funkcjonalność filtra. Tak więc nazywam formularz okna dialogowego z pre-poulatedList<FilterItem>
przekazane w konstruktorze. Teraz, gdy okno dialogowe zostanie załadowane, przechodzi iteracyjnie przez każdy element listy i dodaje:
do każdego wiersza w tabeli TableLayoutPanel. Pole wyboru pobiera jego właściwość tekstowąFilterProperty
i jego status sprawdzony zFilterPropertyChecked
... Combobox otrzymuje swoje powiązanieFilterOperator
... i pole tekstowe pobiera jego wartość tekstowąFilterValue
.
Zauważ, jak tylko mówiędostaje. Chciałbym automatycznie zaktualizować te właściwości, gdy kontrolki, których właściwości będą musiały się zmienić. słyszałem oObservableCollection<T>
ale wydaje mi się, że nie mam dostępu do niego w WinForm po dodaniuSystem.Collections.ObjectModel
przestrzeń nazw.
Jaki byłby najlepszy sposób, aby to osiągnąć. BindingList z INotifyPropertyChanged? Nie jestem ekspertem w tej ostatniej i byłbym bardzo wdzięczny za pewne wskazówki - jeśli tak powinienem iść.
Dziękuję!
EDYTOWAĆ:
Ok, pozwól, że opublikuję kod, aby pokazać, co powinienem zrobić :). Wiem, że muszę wdrożyćINotifyPropertyChanged
na mojej klasie FilterItem, więc (na przykład dla części FilterValue):
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
}
Teraz topowinien wszystko razem w moim Form_Load (to jest tylko dla części Textbox i pominąłem Checbox i ComboBox) tak:
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;
}
}
DataSindings w polu tekstowym DataSource to element „FilterItem”. Ale teraz wydaje mi się, że mam problem z moim Visual Studio IDE, więc nie mogę tego wypróbować, ale kiedy będę miał go uruchomione. Chciałbym teraz wiedzieć: czy ta konfiguracja będzie z powodzeniem pomagać mojej osobieFilterItem
s, aby uzyskać automatyczną aktualizację, gdy odpowiednie zmiany właściwości przypisanej im Kontroli ??