Отследить смену свойства Tag у контрола
От: Nogard Россия  
Дата: 11.12.08 18:04
Оценка:
Доброе время суток, товарищи!

Столкнулся тут с проблемой — необходимо автоматически реагировать на смену свойства 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 никак не детектируется

Подскажите пожалуйста правильный способ реализации моей задачи или укажите на неточности в моем коде!
tag binding
Re: Отследить смену свойства Tag у контрола
От: Аноним  
Дата: 13.12.08 15:57
Оценка:
попробуй просто отнаследоваться от нужного тебе контрола и там сделать примерно следующее:

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);
        }
    }


единственная проблема, что везде в проекте где использовался старый класс прийдеться заменить объявление на использование нового.
Re[2]: Отследить смену свойства Tag у контрола
От: Владимир Лисник Украина  
Дата: 13.12.08 16:07
Оценка:
совсем забыл добавить... это решение подходит в том случае если вы пишите с использованием .NET 2.0.... если вы пишите на .NET 3 то там надо немного по другому... т.к. Tag теперь DependencyProperty...
Re[3]: Отследить смену свойства Tag у контрола
От: Nogard Россия  
Дата: 26.01.09 12:54
Оценка:
Здравствуйте, Владимир Лисник

Спасибо за ответ, но его реализация в рамках проекта не представляется возможной, по ряду причин, основной из которых является невозможность наследования от нужных контролов (используются сторонние, некоторые sealed).

P.S. Я пересмотрел работу со свойством Tag и решил от нее отказаться
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.