locked
How to make the dynamic grid view and make it clickable? RRS feed

  • Question

  • User186248 posted

    Is there a way to dynamically create a grid's from the List and make it clickable on the PCL project using mvvm?

    Wednesday, March 2, 2016 2:20 AM

Answers

  • User76916 posted

    @MikeDennis - The way you would do this, is create a new control you can use this: Create new Xaml Page and replace with this.

    <Grid xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="Mobile.Controls.GridView">
    
    </Grid>
    
       public partial class GridView : Grid
        {
            public GridView()
            {
                InitializeComponent();
    
                for (var i = 0; i < MaxColumns; i++)
                    ColumnDefinitions.Add(new ColumnDefinition());
            }
    
            public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create<GridView, object>(p => p.CommandParameter, null);
            public static readonly BindableProperty CommandProperty = BindableProperty.Create<GridView, ICommand>(p => p.Command, null);
            public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create<GridView, IEnumerable<object>>(p => p.ItemsSource, null, BindingMode.OneWay, null, (bindable, oldValue, newValue) =>  { ((GridView)bindable).BuildTiles(newValue); });
    
            private int _maxColumns = 2;
            private float _tileHeight = 0;
    
            public Type ItemTemplate { get; set; } = typeof(DocumentTypeTemplate);
    
            public int MaxColumns
            {
                get { return _maxColumns; }
                set { _maxColumns = value; }
            }
    
            public float TileHeight
            {
                get { return _tileHeight; }
                set { _tileHeight = value; }
            }
    
            public object CommandParameter
            {
                get { return GetValue(CommandParameterProperty); }
                set { SetValue(CommandParameterProperty, value); }
            }
    
            public ICommand Command
            {
                get { return (ICommand)GetValue(CommandProperty); }
                set { SetValue(CommandProperty, value); }
            }
    
            public IEnumerable<object> ItemsSource
            {
                get { return (IEnumerable<object>)GetValue(ItemsSourceProperty); }
                set { SetValue(ItemsSourceProperty, value);  }
            }
    
            public void BuildTiles(IEnumerable<object> tiles)
            {
                try
                {
                    if (tiles == null || tiles.Count() == 0)
                        Children?.Clear();
    
                    // Wipe out the previous row definitions if they're there.
                    RowDefinitions?.Clear();
    
                    var enumerable = tiles as IList ?? tiles.ToList();
                    var numberOfRows = Math.Ceiling(enumerable.Count / (float)MaxColumns);
    
                    for (var i = 0; i < numberOfRows; i++)
                        RowDefinitions?.Add(new RowDefinition { Height = TileHeight });
    
                    for (var index = 0; index < enumerable.Count; index++)
                    {
                        var column = index % MaxColumns;
                        var row = (int)Math.Floor(index / (float)MaxColumns);
    
                        var tile = BuildTile(enumerable[index]);
    
                        Children?.Add(tile, column, row);
                    }
                }
                catch { // can throw exceptions if binding upon disposal
                }
            }
    
            private Layout BuildTile(object item1)
            {
                var buildTile = (Layout)Activator.CreateInstance(ItemTemplate, item1);
                buildTile.InputTransparent = false;
    
                var tapGestureRecognizer = new TapGestureRecognizer
                {
                    Command = Command,
                    CommandParameter = item1,
                    NumberOfTapsRequired = 1                
                };
    
                buildTile?.GestureRecognizers.Add(tapGestureRecognizer);
    
    
                return buildTile;
            }
        }
    
       <control:GridView HorizontalOptions="FillAndExpand"
                            Grid.Row="1"
                            VerticalOptions="FillAndExpand"
                            RowSpacing="20"
                            ColumnSpacing="20"
                            MaxColumns="2"
                            ItemsSource="{Binding ListOfData}"
                            CommandParameter="{Binding}"
                            Command="{Binding ClickCommand}"
                            IsClippedToBounds="False">
            <control:GridView.TileHeight>
              <OnPlatform x:TypeArguments="x:Single"
                          iOS="60"
                          Android="60"
                          WinPhone="90" />
            </control:GridView.TileHeight>
          </control:GridView>
    

    This was based on @ChaseFlorell's GridView so the credit goes to him for this. Apologies if my memory is incorrect there.

    • Marked as answer by Anonymous Thursday, June 3, 2021 12:00 AM
    Wednesday, March 2, 2016 8:28 AM
  • User76916 posted

    @MikeDennis - Apologies on the SetBinding, the item you are binding to should be passed as a string and is used to find a property on the BindingContext (ViewModel) to bind it to.

    For example:

    GrdView.SetBinding(GridView.ItemsSourceProperty,"RadioList");

    Though if you are using Visual Studio 2015 and have access to C# 6 features I like the nameof command to help with that compile time checking

    GrdView.SetBinding(GridView.ItemsSourceProperty, nameof(OnlineRadioListVm.RadioList));

    • Marked as answer by Anonymous Thursday, June 3, 2021 12:00 AM
    Sunday, March 6, 2016 12:37 AM

All replies

  • User186248 posted

    @AdamP any idea on this?

    Wednesday, March 2, 2016 6:46 AM
  • User76916 posted

    @MikeDennis - The way you would do this, is create a new control you can use this: Create new Xaml Page and replace with this.

    <Grid xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="Mobile.Controls.GridView">
    
    </Grid>
    
       public partial class GridView : Grid
        {
            public GridView()
            {
                InitializeComponent();
    
                for (var i = 0; i < MaxColumns; i++)
                    ColumnDefinitions.Add(new ColumnDefinition());
            }
    
            public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create<GridView, object>(p => p.CommandParameter, null);
            public static readonly BindableProperty CommandProperty = BindableProperty.Create<GridView, ICommand>(p => p.Command, null);
            public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create<GridView, IEnumerable<object>>(p => p.ItemsSource, null, BindingMode.OneWay, null, (bindable, oldValue, newValue) =>  { ((GridView)bindable).BuildTiles(newValue); });
    
            private int _maxColumns = 2;
            private float _tileHeight = 0;
    
            public Type ItemTemplate { get; set; } = typeof(DocumentTypeTemplate);
    
            public int MaxColumns
            {
                get { return _maxColumns; }
                set { _maxColumns = value; }
            }
    
            public float TileHeight
            {
                get { return _tileHeight; }
                set { _tileHeight = value; }
            }
    
            public object CommandParameter
            {
                get { return GetValue(CommandParameterProperty); }
                set { SetValue(CommandParameterProperty, value); }
            }
    
            public ICommand Command
            {
                get { return (ICommand)GetValue(CommandProperty); }
                set { SetValue(CommandProperty, value); }
            }
    
            public IEnumerable<object> ItemsSource
            {
                get { return (IEnumerable<object>)GetValue(ItemsSourceProperty); }
                set { SetValue(ItemsSourceProperty, value);  }
            }
    
            public void BuildTiles(IEnumerable<object> tiles)
            {
                try
                {
                    if (tiles == null || tiles.Count() == 0)
                        Children?.Clear();
    
                    // Wipe out the previous row definitions if they're there.
                    RowDefinitions?.Clear();
    
                    var enumerable = tiles as IList ?? tiles.ToList();
                    var numberOfRows = Math.Ceiling(enumerable.Count / (float)MaxColumns);
    
                    for (var i = 0; i < numberOfRows; i++)
                        RowDefinitions?.Add(new RowDefinition { Height = TileHeight });
    
                    for (var index = 0; index < enumerable.Count; index++)
                    {
                        var column = index % MaxColumns;
                        var row = (int)Math.Floor(index / (float)MaxColumns);
    
                        var tile = BuildTile(enumerable[index]);
    
                        Children?.Add(tile, column, row);
                    }
                }
                catch { // can throw exceptions if binding upon disposal
                }
            }
    
            private Layout BuildTile(object item1)
            {
                var buildTile = (Layout)Activator.CreateInstance(ItemTemplate, item1);
                buildTile.InputTransparent = false;
    
                var tapGestureRecognizer = new TapGestureRecognizer
                {
                    Command = Command,
                    CommandParameter = item1,
                    NumberOfTapsRequired = 1                
                };
    
                buildTile?.GestureRecognizers.Add(tapGestureRecognizer);
    
    
                return buildTile;
            }
        }
    
       <control:GridView HorizontalOptions="FillAndExpand"
                            Grid.Row="1"
                            VerticalOptions="FillAndExpand"
                            RowSpacing="20"
                            ColumnSpacing="20"
                            MaxColumns="2"
                            ItemsSource="{Binding ListOfData}"
                            CommandParameter="{Binding}"
                            Command="{Binding ClickCommand}"
                            IsClippedToBounds="False">
            <control:GridView.TileHeight>
              <OnPlatform x:TypeArguments="x:Single"
                          iOS="60"
                          Android="60"
                          WinPhone="90" />
            </control:GridView.TileHeight>
          </control:GridView>
    

    This was based on @ChaseFlorell's GridView so the credit goes to him for this. Apologies if my memory is incorrect there.

    • Marked as answer by Anonymous Thursday, June 3, 2021 12:00 AM
    Wednesday, March 2, 2016 8:28 AM
  • User186248 posted

    @AdamP :

    Found the following errors with the code which you shared above 1.The type or namespace name 'DocumentTypeTemplate' could not be found (are you missing a using directive or an assembly reference?) Online.Radio.Core C:\Users\Mike\Documents\Tutorials\grid\online-grid\UI\Online.Radio\Online.Radio.Core\Pages\Content\GridView.xaml.cs 35
    2.The name 'InitializeComponent' does not exist in the current context 3. No Data's are displayed on the UI

    Note: All the elements of the grid = > Text, no Images or other formats

    Can you please help me to resolve this issue as soon as possible, its blocking the release

    Thursday, March 3, 2016 2:07 AM
  • User76916 posted

    @MikeDennis - the TypeTemplate is just a template, can be called anything. Its a new xaml page and replace with

    <Grid xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="Mobile.TypeTemplate">
    
        <Label Text="{Binding Name}" />
    
    </Grid>
    

    You can format that however you want. Code behind of

     public partial class TypeTemplate : Grid
        {
            public TypeTemplate()
            {
                InitializeComponent();
            }
    
            public TypeTemplate(object item)
            {
                InitializeComponent();
                BindingContext = item;
            }
    
        }
    
    Thursday, March 3, 2016 2:21 AM
  • User186248 posted

    @AdamP

    How this works? I am little confused here. Can you please correct me if i am wrong?

    GridviewType - this page will have data which needs to be displayed for single grid

    then how do i do a recursive for all the elements on the list, I mean a main grid with multiple cells in it

    Thursday, March 3, 2016 2:31 AM
  • User186248 posted

    @AdamP - for the clarification:::

    1. Master Grid Page which needs to display the data in the grid(multiple labels tiedup) format dynamically, this page is dynamically tied up with the ViewModel(masterViewModel) which has the IEnumerableList - with Type,name,id,frequency
    2. Created a Grid view and added the code like you defined.

    Now what typeTemplate should I create and where should I place the command event and how to define which items on the list to be displayed?

    Thursday, March 3, 2016 3:01 AM
  • User76916 posted

    @MikeDennis - the click is defined on the gridview not on the template. That is what the ClickCommand is.

    The Template is just what you want displayed in each tile. You can put anything you want in that Grid. This is the template that gets applied to each element of the list. So Binding to Name, Id, Frequency will get you those values.

    Thursday, March 3, 2016 3:09 AM
  • User186248 posted

    @AdamP @AdamP i tried with what you said as a result it shows an empty page with no data: created a xaml page with name TypeTemplate and added that in gridview.xaml.cs "public Type ItemTemplate { get; set; } = typeof (TypeTemplate);"

    But TypeTemplate page is never getting initialized, is there any sample which you can share with me.

    Note this is the UWP app one change which I made is Removed <content:GridView.TileHeight> <OnPlatform x:TypeArguments="x:Single" iOS="60" Android="60" WinPhone="90"/> </content:GridView.TileHeight> from master page and updated the ` RowDefinitions?.Add(new RowDefinition {Height = new GridLength(1,GridUnitType.Star)}.

    Thursday, March 3, 2016 4:24 AM
  • User76916 posted

    @MikeDennis - BuildTiles is what should be called when you assign your list to it, then within here is where it calls BuildTile, at that point you can see it create a new ItemTemplate, this is where the constructor will be called.

    If the constructor isn't been called, then BuildTiles isn't calling it. Breakpoint your code and step through and see why is doesn't get there.

    Thursday, March 3, 2016 5:17 AM
  • User186248 posted

    @AdamP do you have any samples? can you please share me the sample which I can test it out and integrate it?

    Thursday, March 3, 2016 5:34 AM
  • User76916 posted

    @MikeDennis - what I shared with you was a sample. What did debugging your app find out? Is the BuildTiles function being called?

    Thursday, March 3, 2016 5:43 AM
  • User186248 posted

    @AdamP finally figured out the issue. its expecting IEnumerable and my code passes IEnumerable, and also BuildTiles are called only when i call it from OnAppearing() ... Is there a way to fix both the above issue?

    Thursday, March 3, 2016 6:30 AM
  • User186248 posted

    @AdamP Solved all the above issue.

    New Problem: Grid doesn't get's updated if the data is updated on the binding element, also its not displaying the other elements in the stacklayout

    <StackLayout Padding="10,10,10,10"> <Label Text="Created" Style="{DynamicResource OrangeLargeAndBoldLabelStyle}"/> <content:GridView x:Name="GrdView" HorizontalOptions="StartAndExpand" Grid.Row="1" VerticalOptions="StartAndExpand" RowSpacing="20" ColumnSpacing="20" MaxColumns="3" ItemsSource="{Binding RawList}" CommandParameter="{Binding}" Command="{Binding ClickCommand}" IsClippedToBounds="False"> <content:GridView.TileHeight> <OnPlatform x:TypeArguments="x:Single" iOS="60" Android="60" WinPhone="90" /> </content:GridView.TileHeight> </content:GridView> </StackLayout>

    Thursday, March 3, 2016 7:19 AM
  • User186248 posted

    @AdamP : Solved all the above problem except the dataBinding update for the second time. is there any change I should do?

    Thursday, March 3, 2016 8:31 AM
  • User186248 posted

    @AdamP : Thanks for your above suggestions, helped a lot in sketching the bindable grid view.

    is there a way I can use the above implementation without xaml in the master detail page? so I can pass values to the GridView Constructor

    Thursday, March 3, 2016 11:10 PM
  • User76916 posted

    @MikeDennis - if you want to use it programmatically you can just go

       MyStackLayout.Children.Add(new GridView());
    

    You just need to add to a control that already exists on the page. If nothing exists you can just do

      ContentPage.Content = new GridView(); 
    

    or put a StackLayout or Grid in first etc.

    Friday, March 4, 2016 12:32 AM
  • User186248 posted

    How to bind the element to the Itemsource? there is an IEnumerableList on my Vm, which I will bind it through Xaml. how to do it on the .cs?

    Friday, March 4, 2016 12:42 AM
  • User186248 posted

    @AdamP i tried with the following code: Inside OnlineRadioListVm I have a static list which keeps updating on the specific action: public static List<TripDto> RadioList{ get; set; }

    and in master grid View.cs: GridView GrdView=new GridView(); GrdView.ItemsSource = SetBinding(GridView.ItemsSourceProperty,OnlineRadioListVm.RadioList); this.Content=GrdView

    and this is my ItemSourceProperty in GridView

    public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create<GridView, IEnumerable<RadioListDataModel>>(p => p.ItemsSource, null, BindingMode.OneWay, null, (bindable, oldValue, newValue) => { ((GridView)bindable).BuildTiles(newValue); }); it throws Error CS1503 Argument 2: cannot convert from 'System.Collections.Generic.List' to 'Xamarin.Forms.BindingBase'

    Friday, March 4, 2016 1:30 AM
  • User76916 posted

    @MikeDennis - you need to do this

    GrdView.SetBinding(GridView.ItemsSourceProperty,OnlineRadioListVm.RadioList);

    No need to assign this to anything.

    Friday, March 4, 2016 3:24 AM
  • User186248 posted

    @AdamP : i added which you said, and i get the same error: Argument 2: cannot convert from 'System.Collections.Generic.List' to 'Xamarin.Forms.BindingBase'

    Friday, March 4, 2016 6:08 AM
  • User76916 posted

    @MikeDennis - are you still assigning to ItemsSource? This line:

    GrdView.ItemsSource = SetBinding(GridView.ItemsSourceProperty,OnlineRadioListVm.RadioList);

    Should get replaced with

    GrdView.SetBinding(GridView.ItemsSourceProperty,OnlineRadioListVm.RadioList);

    Friday, March 4, 2016 6:19 AM
  • User186248 posted

    @AdamP : no I am not assigning, I am using GrdView.SetBinding(GridView.ItemsSourceProperty,OnlineRadioListVm.RadioList);

    Friday, March 4, 2016 7:30 AM
  • User186248 posted

    @AdamP is there a way i can add multiple selection to the grid view and return a list ?

    Saturday, March 5, 2016 1:21 AM
  • User74518 posted

    @AdamP you should win the Oscar of patience, instead of Leo :smile:

    Saturday, March 5, 2016 4:04 PM
  • User76916 posted

    @MikeDennis - Yes you can make it multiple selection. The easiest way I can think of is, adding a new property to the Items that you are binding, something like

    public bool IsSelected { get; set; }

    Then on the ClickCommand, set the IsSelected to on or off (basically the opposite of what it is).

    Then at the end, just get the ItemsSource and get all Items with IsSelected == true and there you have multiple select.

    You can then also show that it is selected by doing some kind of visual based off the IsSelected. (make sure you implement INPC for the property or item through when the IsSelected property is changed).

    Sunday, March 6, 2016 12:01 AM
  • User76916 posted

    @MikeDennis - Apologies on the SetBinding, the item you are binding to should be passed as a string and is used to find a property on the BindingContext (ViewModel) to bind it to.

    For example:

    GrdView.SetBinding(GridView.ItemsSourceProperty,"RadioList");

    Though if you are using Visual Studio 2015 and have access to C# 6 features I like the nameof command to help with that compile time checking

    GrdView.SetBinding(GridView.ItemsSourceProperty, nameof(OnlineRadioListVm.RadioList));

    • Marked as answer by Anonymous Thursday, June 3, 2021 12:00 AM
    Sunday, March 6, 2016 12:37 AM
  • User95229 posted

    Hi all,

    I reconstructed from the previous discussion what needs to be done. here is the sample https://github.com/dinonovak/XamarinFormsDynamicGridView

    I am unable to resolve issue how to bind gridview items to list, can someone please help. All is initialized on the /TEST_Springboard/SpringboardMain.cs page

    Thanx for the hints, D

    Saturday, April 30, 2016 4:05 PM
  • User216306 posted

    Thanks for this example, but I had to upgrade the framework from xamarin forms 1.x to 2.x and the Create method for the bindings does not work anymore. I have changed to this, but the Tap command is only working for IOS:

    public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create(nameof(CommandParameter), typeof(object), typeof(GridView), null);
    
    public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(GridView), null);
    
    public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create(nameof(ItemsSource), typeof(IEnumerable), typeof(GridView)
                , null, BindingMode.OneWay, null, (bindable, oldValue, newValue) => { ((GridView)bindable).BuildTiles(newValue as IEnumerable<object>); });
    
    Wednesday, August 31, 2016 10:57 AM
  • User2773 posted

    maybe it would help: https://github.com/daniel-luberda/DLToolkit.Forms.Controls/tree/master/FlowListView

    Monday, September 5, 2016 10:49 PM
  • User289306 posted

    Hi Adam Pedley, I have implemented above mentioned Gridview control . And also some list of items binded with itemsource. But when i executing the source i was getting " System.NullReferenceException: Object reference not set to an instance of an object." in below mentioned line:

    public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create>(p => p.ItemsSource, null, BindingMode.OneWay, null, (bindable, oldValue, newValue) => { ((GridView)bindable).BuildTiles(newValue); });

    Thanks

    kirubha

    Friday, January 27, 2017 5:05 PM
  • User101185 posted

    @AdamP I used your given example it's working good with IOS but in Android scrollview is giving issues it's overlapping the other control on gridview item scroll .

    Below is running example

    Thursday, August 3, 2017 12:07 PM
  • User109417 posted

    @MikeDennis said: @AdamP : Solved all the above problem except the dataBinding update for the second time. is there any change I should do?

    How did you happen to solve this as if i set the itemsourceproperty again and debug the buildtiles method gets null for IEnumerable.

    Thursday, August 24, 2017 10:21 AM
  • User206785 posted

    @MikeDennis - How can we create a bindable property for ItemTemplate in above example ?

    Tuesday, August 29, 2017 7:22 AM
  • User49837 posted

    @AdamP Command binding is not hitting the viewmodel on click of the tile kindly help with that

    Monday, October 9, 2017 7:39 AM
  • User49837 posted

    @pratiuskumardubey How did you performed command binding for me it not hitting on the tap of the tile

    Monday, October 9, 2017 9:15 AM
  • User101185 posted

    @Nithya Check the below xaml, How to use the command binding

    Monday, October 9, 2017 10:36 AM
  • User101185 posted

    <ScrollView IsVisible="{Binding IsGridviewVisible,Mode=TwoWay}" Grid.Column="1" Grid.Row="1"> <controls:GridView ColumnSpacing="10" ItemTappedCommand="{Binding ItemTapCommand}" ItemsSource="{Binding GridViewCategories}" MaxColumns="1" Padding="5" RowSpacing="10" TileHeight="200" > <controls:GridView.ItemTemplate> <DataTemplate> <Grid> <Grid.RowDefinitions> <RowDefinition Height=".5*" /> <RowDefinition Height=".1*" /> </Grid.RowDefinitions> <Image Aspect="AspectFill" Source="{Binding ImageURL}" /> <StackLayout Orientation="Vertical" HorizontalOptions="StartAndExpand" VerticalOptions="EndAndExpand"> <Label Text="{Binding CategoryName}" TextColor="White" FontSize="15" FontAttributes="Bold" LineBreakMode="WordWrap" /> <Label Text="{Binding OperningHours}" TextColor="White" FontSize="15" LineBreakMode="WordWrap" /> </StackLayout> <Image Source="GetButton" Grid.Row="1" HorizontalOptions="EndAndExpand" VerticalOptions="CenterAndExpand"/> </Grid> </DataTemplate> </controls:GridView.ItemTemplate> </controls:GridView> </ScrollView>

    Monday, October 9, 2017 10:37 AM
  • User49837 posted

    @AdamP @pratiuskumardubey ClickCommand we are doing in GridView is not hitting the command in viewmodel....but at time of creation command is added to the tap gesture in build tile method...

    Monday, October 9, 2017 12:03 PM
  • User358258 posted

    can any one share the project list view with 4 columns and multiple rows in xamarin forms.

    Friday, December 15, 2017 1:18 PM
  • User176776 posted

    Hey @Nithya :)

    Check the BuildTile(object item1) method in the GridView. There is followingcode:

    private Layout BuildTile(object item1) { var buildTile = (Layout)Activator.CreateInstance(ItemTemplate, item1); buildTile.InputTransparent = false;

            var tapGestureRecognizer = new TapGestureRecognizer
            {
                CommandParameter = item1,
                NumberOfTapsRequired = 1,
                Command = Command
            };
    
            buildTile.GestureRecognizers.Add(tapGestureRecognizer);
    
    
            return buildTile;
        }
    

    Just exchange with this and it will work:

    private Layout BuildTile(object item1) { var buildTile = (Layout)Activator.CreateInstance(ItemTemplate, item1); buildTile.InputTransparent = false;

            var tapGestureRecognizer = new TapGestureRecognizer
            {
                CommandParameter = item1,
                NumberOfTapsRequired = 1,
                Command = new Command(new Action<object>(target))
            };
    
            buildTile.GestureRecognizers.Add(tapGestureRecognizer);
    
    
            return buildTile;
        }
    
        private void target(object arg2)
        {
            Command.Execute(arg2);
        }
    
    Saturday, December 16, 2017 5:02 PM
  • User224709 posted

    Can you guys share the working example so that it will be useful. Above codes are confused and duno how to proceed further

    Monday, September 16, 2019 10:09 AM