根据数据动态创建控件及为控件动态绑定事件(事件不只一个,包括匿名方法). |
改用反射实现,用反射获得button的eventhandler,并对它进行反注册。
方法一。
PropertyInfo propertyInfo =typeof(Button).GetProperty("Events",
BindingFlags.Instance| BindingFlags.NonPublic);
System.ComponentModel.EventHandlerList eventHandlerList= (System.ComponentModel.EventHandlerList)propertyInfo.GetValue(btntmp,null);
FieldInfo fieldInfo= (typeof(Control)).GetField("EventClick",BindingFlags.NonPublic| BindingFlags.Static);
Delegate d= eventHandlerList[fieldInfo.GetValue(null)];
if (d !=null)
{foreach (Delegate tempin d.GetInvocationList())
{ btntmp.Click-=temp; } }
方法二。
使用匿名委托订阅事件,取消订阅比较麻烦。
可以这样实现,把委托或匿名方法保存在一个变量中。
订阅及取消时使用这个变量就可以了。
private void TestButton_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Test button click");
}
private RoutedEventHandler reHandler = null;
private void AddEventButton_Click(object sender, RoutedEventArgs e)
{
reHandler = (s, se) => { TestButton_Click(s, se); };
//reHandler = delegate(object senderr, RoutedEventArgs ee) { TestButton_Click(senderr, ee); };
btn1.Click += reHandler;
}
private void RemoveEventButton_Click(object sender, RoutedEventArgs e)
{
btn1.RemoveHandler(Button.ClickEvent, reHandler);
}
例如:
private NotifyCollectionChangedEventHandler collectionchangedHandler = null;
foreach (CarrierPosition item in RealtimemonitorForTrac.Tracks)
{
item.TrackPoints.Clear();
if (collectionchangedHandler != null)
{
//取消掉上次注册的事件 。
item.TrackPoints.CollectionChanged -= collectionchangedHandler;
}
_addLineToNewMap(item);
trackcarriers++;
}
private void _addLineToNewMap(CarrierPosition item)
{
try
{
int titleviewitemcount = this.titleview.Items.Count;
var line = new AWLine(item.TerminalNo);
Map map = null;
if (trackcarriers < titleviewitemcount)
{
map = ((RadTileViewItem)this.titleview.Items[trackcarriers]).Content as Map;
_initMapDate(map);
map.IMap.AddLine(line);
((RadTileViewItem)this.titleview.Items[trackcarriers]).Name = item.TerminalNo;
((RadTileViewItem)this.titleview.Items[trackcarriers]).Header = item.Name;
}
else //新增
{
map = new Map();
_initMapDate(map);
map.IMap.AddLine(line);
RadTileViewItem radTitleViewItem = new RadTileViewItem();
radTitleViewItem.Content = map;
radTitleViewItem.Name = item.TerminalNo;
radTitleViewItem.Header = item.Name;
this.titleview.Items.Add(radTitleViewItem);
}
collectionchangedHandler = (o, ox) =>
{
_trackPointsChanges(map, ox);
};
//注册事件
item.TrackPoints.CollectionChanged += collectionchangedHandler;
line.IsFitView = true;
_TrackLines.Add(line.Identity, line);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}