I have the following class, and want to pass the text variable as RoutedEventArgs.
public class CloseableTabItem : TabItem
{
String text;
public
I needed something similar and with the help of both @Arya and @H.B. I came up with this:
My custom RoutedEventArgs subclass
public class ChangePageEventArgs : RoutedEventArgs {
private readonly int _pageNumber;
public int PageNumber {
get { return _pageNumber; }
}
public ChangePageEventArgs(RoutedEvent routedEvent, int pageNumber) : base(routedEvent) {
this._pageNumber = pageNumber;
}
}
My child class
private void defineButton_Click(object sender, RoutedEventArgs e) {
ChangePageItemList(2);
}
public static readonly RoutedEvent GoToItemPropertiesViewEvent = EventManager.RegisterRoutedEvent(
"GoToItemPropertiesView", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NoObjectView));
// Provide CLR accessors for the event
public event RoutedEventHandler GoToItemPropertiesView {
add { AddHandler(GoToItemPropertiesViewEvent, value); }
remove { RemoveHandler(GoToItemPropertiesViewEvent, value); }
}
public void ChangePageItemList(int _pageNumber) {
ChangePageEventArgs args = new ChangePageEventArgs(GoToItemPropertiesViewEvent, _pageNumber);
this.RaiseEvent(args);
}
My parent class
private ItemListView createItemListView() {
_itemListView = new ItemListView();
_itemListView.GoToItemPropertiesView += new RoutedEventHandler(ChangePage);
return _itemListView;
}
private void ChangePage(object sender, RoutedEventArgs e) {
ChangePageEventArgs args = (ChangePageEventArgs)e;
// Value of page number is 2
int _pageNumber = args.PageNumber;
}
Hope it helps you @Arya
1 - create a new event data class:
public class SelectedRowEventArgs : RoutedEventArgs
{
public int Value { get; set; }
public SelectedRowEventArgs(RoutedEvent routedEvent, int value) : base(routedEvent)
{
this.Value = value;
}
}
2 - create links code in a user control:
public partial class AusenciasBaseAdmin : UserControl
{
public static readonly RoutedEvent RowChangedEvent = EventManager.RegisterRoutedEvent("RowChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AusenciasBaseAdmin));
public event RoutedEventHandler RowChanged
{
add { AddHandler(RowChangedEvent, value); } remove { RemoveHandler(RowChangedEvent, value); }
}
public AusenciasBaseAdmin()
{
InitializeComponent();
}
private void RegAusencias_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.RaiseEvent(new SelectedRowEventArgs(RowChangedEvent, 1));
}
}
3 - link the user control in a main form:
<control:AusenciasBaseAdmin Grid.Row="0" Grid.Column="0"
x:Name="GridAusencias"
RowChanged="GridAusencias_RowChanged_1"
/>
4 - behind code in a main form:
private void GridAusencias_RowChanged_1(object sender, RoutedEventArgs e)
{
SelectedRowEventArgs t = (SelectedRowEventArgs)e;
MessageBox.Show(t.Value.ToString());
}
CONGRATULATIONS FOR WPF TEAM. YOU HAVE ACHIEVED TO DO IT EXTREMELY COMPLEX
Create a new subclass of RoutedEventArgs, add a property to it where you can store the variable to be passed and create a respective handler delegate of type void (object, YourNewEventArgs) which you then assign as the handler type of your event (which currently uses a normal RoutedEventHandler which hence only provides normal RoutedEventArgs).
If the event then is to be raised you need to create your new event args and pass the variable to its property for that variable. How to get the value in the handler should be self-explanatory.