我正在使用一个表单,可以通过编程方式创建和删除一些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;
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好*...问题是,从窗口中删除ComboBox时该怎么办.我需要从按钮的Style中删除触发器,因为我不再希望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;
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用 - 如果触发器在激活时被移除,则按钮保持禁用状态.
我曾经假设按钮会在给出一个新按钮时重新评估它的样式.添加触发器时似乎会发生这种情况,但是当它被移除时却不会发生 - 我在这里缺少什么?
编辑: 根据HB评论中的建议更改了添加/删除触发器的代码.但是,问题仍然存在.
编辑2:*毕竟可能不是那么好 - 我继续尝试添加额外的ComboBox(和触发器)并发现添加第二个触发器似乎打破了第一个触发器.使用此代码,只有最近添加的触发器才有效.我是否应该将FrameworkElement的触发器视为一次性写入集合并找到实现此类行为的不同方法?
自从提出这个问题以来已经很长一段时间了,但我想我至少应该发布我如何解决这个问题以便分享:
我从未找到一种方法来删除可靠工作的触发器。因此,我在视图中添加了一个属性,该属性指示所有触发器如果存在的话将如何评估,并将其连接DataTrigger到该属性。
public bool TriggerPoseur { get; set; } // Actually notifies when it changes
Run Code Online (Sandbox Code Playgroud)
创建一个处理程序来监视触发器将监视的属性,而不是添加和删除触发器:
public void ComboBoxDataContext_SelectedItemChanged(object sender, PropertyChangedEventArgs e) { //update TriggerPoseur }
Run Code Online (Sandbox Code Playgroud)
这避免了创建和删除触发器的所有麻烦。相反,只有一个触发器,添加和删除事件处理程序就可以正常工作。
(哈基,是的。)