正确的方法来删除触发器

Sea*_*n U 6 c# wpf

我正在使用一个表单,可以通过编程方式创建和删除一些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的触发器视为一次性写入集合并找到实现此类行为的不同方法?

Sea*_*n U 1

自从提出这个问题以来已经很长一段时间了,但我想我至少应该发布我如何解决这个问题以便分享:

我从未找到一种方法来删除可靠工作的触发器。因此,我在视图中添加了一个属性,该属性指示所有触发器如果存在的话将如何评估,并将其连接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)

这避免了创建和删除触发器的所有麻烦。相反,只有一个触发器,添加和删除事件处理程序就可以正常工作。

(哈基,是的。)