Estoy tratando de usar System.Windows.Forms.PropertyGrid
.¿Por qué el atributo Browsable hace que la propiedad no sea vinculable?
Para hacer una propiedad no visible en esta cuadrícula, se debe usar BrowsableAttribute
establecido en false
. Pero agregar este atributo hace que la propiedad no sea vinculable.
Ejemplo: Crear un nuevo proyecto de Windows Forms, y soltar un TextBox
y PropertyGrid
en Form1
. Con el siguiente código, el ancho de la TextBox
no quede obligado a Data.Width
:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Data data = new Data();
data.Text = "qwe";
data.Width = 500;
BindingSource bindingSource = new BindingSource();
bindingSource.Add(data);
textBox1.DataBindings.Add("Text", bindingSource, "Text", true,
DataSourceUpdateMode.OnPropertyChanged);
textBox1.DataBindings.Add("Width", bindingSource, "Width", true,
DataSourceUpdateMode.OnPropertyChanged);
propertyGrid1.SelectedObject = data;
}
}
El código para la clase de datos es:
public class Data : IBindableComponent
{
public event EventHandler TextChanged;
private string _Text;
[Browsable(true)]
public string Text
{
get
{
return _Text;
}
set
{
_Text = value;
if (TextChanged != null)
TextChanged(this, EventArgs.Empty);
}
}
public event EventHandler WidthChanged;
private int _Width;
[Browsable(false)]
public int Width
{
get
{
return _Width;
}
set
{
_Width = value;
if (WidthChanged != null)
WidthChanged(this, EventArgs.Empty);
}
}
#region IBindableComponent Members
private BindingContext _BindingContext;
public BindingContext BindingContext
{
get
{
if (_BindingContext == null)
_BindingContext = new BindingContext();
return _BindingContext;
}
set
{
_BindingContext = value;
}
}
private ControlBindingsCollection _DataBindings;
public ControlBindingsCollection DataBindings
{
get
{
if (_DataBindings == null)
_DataBindings = new ControlBindingsCollection(this);
return _DataBindings;
}
}
#endregion
#region IComponent Members
public event EventHandler Disposed;
public System.ComponentModel.ISite Site
{
get
{
return null;
}
set
{
}
}
#endregion
#region IDisposable Members
public void Dispose()
{
throw new NotImplementedException();
}
#endregion
}
Si cambia el atributo navegable true en cada propiedad en Datos funciona Ahora parece que BindingSource busca el origen de datos por el atributo de búsqueda.
Sí, tiene usted razón. Parece funcionar. Tengo este problema en un proyecto larg. Trataré de escribir un mejor ejemplo pronto. – bodziec