使用C#处理不同类的事件

时间:2016-06-06 12:53:42

标签: wpf events

我有一个在A类中定义的属性。当属性被更改时,我需要引发一个事件。另一个B级应该响应这个事件并做一些事情。我做过类似的事情:

代码:

Class A{
string variable = "test";
public delegate void EventHandler(object sender, EventArgs args);
public static event EventHandler ThrowAddEvent = delegate { };
public static event EventHandler ThrowRemoveEvent = delegate { };
public String Name { get; set; }
public int Select { get; set; }
public Window Formref1 { get; set; } 
 public bool IsSelected
    {
        get { return IsSlctd; }
        set
        {
            IsSlctd = value;
            if (value)
            {
                ThrowAddEvent(this, new EventArgs());

            }

            else
            {
                ThrowRemoveEvent(this, new EventArgs());
            }


        }
    }
}

另一个响应此事件的类定义如下:

Class B{
 public B(ParsedResult _result)
    {
        InitializeComponent();
        if (_result != null)
        {
            this.Result = _result;
            PopulateColumns1();
            DataGrid1.Items.Clear();
            DataGrid1.ItemsSource = Populatevariables();

        }
    }
 public void PopulateColumns1()
    {
        DataGridTextColumn Colvar = new DataGridTextColumn();
        Colvar.Header = "Variables";
        Colvar.Binding = new Binding("Name");
        DataGrid1.Columns.Add(Colvar);

         DataGridTemplateColumn Col = new DataGridTemplateColumn();


        Col.Header = "Select";

        DataTemplate dd = new DataTemplate();
        FrameworkElementFactory FF = new FrameworkElementFactory(typeof(CheckBox));
        FF.SetBinding(CheckBox.BindingGroupProperty, new Binding("Select"));
        FF.SetBinding(CheckBox.IsCheckedProperty, new Binding("IsSelected") { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
        FF.SetValue(FrameworkElement.HorizontalAlignmentProperty, HorizontalAlignment.Center);


        dd.VisualTree = FF;
        Col.CellTemplate = dd;

        DataGrid1.Columns.Add(Col);
    }

private List<A> PopulateVariables()
    {

        CheckBox cb = new CheckBox();
        List<A> CharList = new List<A>();
        Result.GetCharacteristicList.MoveNext();
        IEnumerator<A2LCharacteristic> enumeratorlist = Result.GetCharacteristicList;
        for (int i = 0; enumeratorlist.MoveNext(); i++)
        {
            CharList.Add(new A() { Name = enumeratorlist.Current.Name,  Select = i, Formref1 = this});

        }


        enumeratorlist.Reset();
        return CharList;
    }
private void OKBtn_Click(object sender, RoutedEventArgs e)
    {            
        A Instance_A = new A();

        Instance_A.ThrowAddEvent += (sender1, args) => { Addvrbl(Instance_A.variable); };

        Instance_A.ThrowRemoveEvent += (sender2, args) => { RmvVrbl(Instance_A.variable); };
        this.Close();
    }

 public void Addvrbl(string vrbl)
    {
        if (!(vrbllist.Contains(vrbl)))
        {
            vrbllist.Add(vrbl);
        }
    }

    public void RmvVrbl(string vrbl)
    {
        if ((vrbllist.Contains(vrbl)))
        {
            vrbllist.Remove(vrbl);
        }
    }
}

问题是它没有进入方法&#34; AddVrbl&#34;和&#34; RmvVrbl&#34;。我使用了here的解决方案。请帮忙。

1 个答案:

答案 0 :(得分:1)

好的,而不是订阅A的新实例的事件,它永远不会被触发/发布。初始化CharList时,您必须订阅每个A项的事件。

类似的东西:

for (int i = 0; enumeratorlist.MoveNext(); i++)
{
     var obja=new A() { Name = enumeratorlist.Current.Name, Select = i, Formref1 = this};
     obja.ThrowAddEvent += ...
     obja.ThrowRemoveEvent += ...
     CharList.Add(obja);    
}

PS:请确保在从CharList移除项目之前取消订阅这些活动。