Tengo controles que no actualizan las propiedades respectivas de los objetos vinculados hasta que se pierde el foco. Hay preguntas similares con declaraciones aceptadas que hacen referencia a DataSourceUpdateMode.OnPropertyChange
siendo declaradas, lo que hago, pero el comportamiento persiste. Aquí hay una implementación de ejemplo. Trataré de ser minucioso, pero conciso. Se accede a la clase MyConfig
a través de una propiedad en una clase de Singleton que llamo al Configuration
.Control no actualizando inmediatamente la propiedad vinculada con INotifyPropertyChanged
[Serializable]
public class MyConfig : INotifyPropertyChanged
{
public enum MyEnum
{
Foo,
Bar
}
public MyConfig()
{
MyProperty = MyEnum.Foo;
}
private MyEnum _MyProperty;
public MyEnum MyProperty
{
get { return _MyProperty; }
set { if (value != _MyProperty) { _MyProperty = value; OnPropertyChanged("MyProperty"); } }
}
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
throw new ArgumentNullException(propertyName);
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class ConfigForm : Form
{
public ConfigForm()
{
InitializeComponent();
MyComboBox.Items.AddRange(Enum.GetNames(typeof(MyConfig.MyEnum)));
}
private void ConfigForm_Load(object sender, EventArgs e)
{
MyComboBox.DataSource = Enum.GetValues(typeof(MyConfig.MyEnum));
MyComboBox.DataBindings.Add("SelectedItem", Configuration.Instance.MyConfig, "MyProperty", false, DataSourceUpdateMode.OnPropertyChanged);
}
}
No estoy seguro, dada la breve implementación siguiente, lo que podría pasar por alto para garantizar cambios inmediatos a la propiedad. Puedo cambiar, en este caso desde Foo
a Bar
en el ComboBox, pero a menos que elimine el foco del ComboBox, nada cambia. ¿Alguien tiene alguna idea?
funciona como un encanto. ¡Un millón de gracias! Y me has enseñado un poco sobre la personalización de los controles existentes :) –
Esta es la única solución que he encontrado que realmente funciona. Gracias. –