【发布时间】:2011-07-25 20:46:23
【问题描述】:
我正在使用一种可以通过编程方式创建和删除某些 ComboBox 的表单。
创建它们时,会创建一些针对它们的触发器并将其应用于按钮:
Dictionary<ComboBox, DataTrigger> triggers = new Dictionary<ComboBox, DataTrigger>();
private void CreateTrigger(ComboBox box)
{
Style s = new Style(typeof(Button), MyButton.Style);
foreach(TriggerBase aTrigger in MyButton.Style.Triggers)
s.Triggers.Add(aTrigger);
DataTrigger t = new DataTrigger
{
Binding = new Binding("SelectedItem") { Source = box },
Value = null
};
t.Setters.Add(new Setter(Button.IsEnabledProperty, false));
s.Triggers.Add(t);
triggers.Add(box, t);
MyButton.Style = s;
}
到目前为止一切顺利*。 . .问题是,当 ComboBox 从窗口中删除时该怎么办。我需要从按钮的样式中删除触发器,因为我不再希望 ComboBox 影响其行为。我尝试了最明显的选择:
private void RemoveTrigger(ComboBox box)
{
Style s = new Style(typeof(Button), MyButton.Style);
foreach(TriggerBase aTrigger in MyButton.Style)
if(aTrigger != triggers[box]) s.Triggers.Add(aTrigger);
triggers.Remove(box);
MyButton.Style = s;
}
但这似乎不起作用 - 如果触发器在它处于活动状态时被移除,那么按钮将保持禁用状态。
我曾假设按钮在获得新样式时会重新评估其样式。添加触发器时似乎会发生这种情况,但在删除触发器时不会发生这种情况 - 我在这里错过了什么?
编辑:根据H.B.'s comment 中的建议更改了添加/删除触发器的代码。但是,问题仍然存在。
编辑 2: *也许到目前为止还没有那么好 - 我继续尝试添加一个额外的 ComboBox(和触发器)并发现添加第二个触发器似乎会破坏第一个触发器。使用此代码,只有最近添加的触发器有效。我是否应该将 FrameworkElement 的触发器视为一次写入的集合并找到一种不同的方法来实现这种行为?
【问题讨论】:
-
如果Button被移除,Trigger不会同时被移除吗?