ObservableCollection <T> no WinForms e possíveis alternativas
Winforms .net 3.5 app. No meu aplicativo eu tenho uma classe genérica que se parece com isso:
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; }
}
e eu uso em todas as minhas caixas de diálogo quando quero implementar algum tipo de funcionalidade de filtro. Então eu chamo o formulário de diálogo com um pré-poulatedList<FilterItem>
passado no construtor. Agora, quando a caixa de diálogo é carregada, itera através de cada item de lista e adiciona:
para cada linha em um TableLayoutPanel. A caixa de seleção obtém sua propriedade de texto deFilterProperty
e seu status verificado deFilterPropertyChecked
... o Combobox recebe sua ligação deFilterOperator
... e a caixa de texto obtém seu valor de texto deFilterValue
.
Observe como eu estou apenas dizendofica. O que eu gostaria de fazer é atualizar automaticamente essas propriedades quando os controles cujas propriedades eles estão vinculados a alterar. Eu ouvi sobreObservableCollection<T>
mas eu não pareço ter 'acesso' a ele no WinForms depois de adicionar oSystem.Collections.ObjectModel
namespace.
Qual seria a melhor maneira de conseguir isso? BindingList com INotifyPropertyChanged? Eu não sou um especialista com este último, e gostaria muito de algumas dicas - se é assim que eu deveria ir.
Obrigado!
EDITAR:
Ok, deixe-me postar algum código para mostrar o que eu acho que deveria estar fazendo :). Eu sei que preciso implementarINotifyPropertyChanged
na minha classe FilterItem, então (apenas para a parte FilterValue por exemplo):
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
}
Agoradevemos todos vêm juntos no meu Form_Load (isso é apenas para a parte da caixa de texto e eu omiti o Checbox e ComboBox) da seguinte forma:
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;
}
}
as ligações de dados da caixa de texto DataSource é o 'item' FilterItem. Mas agora parece que estou tendo um problema com o IDE do meu visual studio, então não posso tentar fazer isso, mas quando estiver pronto e funcionando. O que eu gostaria de saber agora é: essa configuração ajudará a permitir que meu clienteFilterItem
s para ser atualizado automaticamente quando a respectiva propriedade do Controle atribuído muda ??