Доброе время суток, товарищи!
Столкнулся тут с проблемой — необходимо автоматически реагировать на смену свойства Tag у некоторого контрола (туда записывается некоторый объект). Так как контрол не содержит события TagChanged, пришлось что-то придумывать...
Решил использовать механизм DataBinding: связать свойство Tag контрола с каким-то промежуточным объектом, с единственным свойством
object Value;
в сеттере которого можно было бы сделать какие-либо действия...
Написал небольшой класс TagChangedDetector:
public class TagChangedDetector {
private object value;
public object Value {
get {
return value;
}
set {
if(this.value!=value) {
this.value = value;
MessageBox.Show("Changed");
}
}
}
}
Затем добавил биндинг:
TagChangedDetector tcd = new TagChangedDetector();
edit.DataBindings.Add("Tag", tcd, "Value",false,DataSourceUpdateMode.OnPropertyChanged,null);
Запустил, сменил тег у контрола — ноль реакции... Передал фокус контролу, потом другому — и тут выскочил MessageBox!
В общем, путем экспериментов было выяснено, что если не делать лишних телодвижений по передаче-смене фокуса у этого контрола — смена Tag никак не детектируется
Подскажите пожалуйста правильный способ реализации моей задачи или укажите на неточности в моем коде!
попробуй просто отнаследоваться от нужного тебе контрола и там сделать примерно следующее:
public class Class1 : System.Windows.Forms.Button
{
public event EventHandler TagPropertyChanged;
public new object Tag
{
get
{
return base.Tag;
}
set
{
if (base.Tag != value)
{
base.Tag = value;
OnTagPropertyChanged(this, EventArgs.Empty);
}
}
}
public void OnTagPropertyChanged(object sender, EventArgs e)
{
if (null != TagPropertyChanged)
TagPropertyChanged(sender, e);
}
}
единственная проблема, что везде в проекте где использовался старый класс прийдеться заменить объявление на использование нового.
совсем забыл добавить... это решение подходит в том случае если вы пишите с использованием .NET 2.0.... если вы пишите на .NET 3 то там надо немного по другому... т.к. Tag теперь DependencyProperty...