shaboinkin
shaboinkin

Reputation: 183

UWP clicking button within a listview

I'm trying to do some basic UI and binding in UWP to get my head wrapped around it but I'm having trouble accessing a button within a listview item.

I have a Button where on clicking it, it creates a new object which is added to my ObservableCollection which then ends up adding a new item in my ListView

XMAL

    <ListView Grid.Row="1" ItemsSource="{x:Bind counts}" x:Name="buttonsView" Margin="5,0" Background="White" Foreground="#FF5059AB">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:Counter">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{x:Bind CountValue, Mode=TwoWay}" FontWeight="Black"/>
                    <Button Click="Increment_Click"  Content="Increment"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

C#

public class Counter
{
    private int count;

    public Counter()
    {
        count = 0;
    }

    public int CountValue
    {
        get
        {
            return count;
        }
        set
        {
            count = value;
        }
    }
}

public sealed partial class MainPage : Page
{
    ObservableCollection<Counter> counts = new ObservableCollection<Counter>();

    public MainPage()
    {
        this.InitializeComponent();
    }

    private void Increment_Click(object sender, RoutedEventArgs e)
    {
         // ?
    }

    private void AddCounter_Click(object sender, RoutedEventArgs e)
    {
        counts.Add(new Counter());
    }
}

That works.

But when I click on the button within the StackPanel, the Increment_Click method is called but I'm not sure what to do at that point. I would like to access the Counter object by getting the index of the ListView item and using that to index into the ObservableCollection.

How do I figure out what the index is of the ListView item that was added?

Upvotes: 0

Views: 1908

Answers (1)

Martin Zikmund
Martin Zikmund

Reputation: 39102

Instead of an event you should use Command and CommandParameter. You would then bind the Command to a command implemented in Counter and CommandParameter to the item (like {Binding}).

However, you can achieve your goal with Click event as well using DataContext:

private void Increment_Click(object sender, RoutedEventArgs e)
{
     var button = (Button)sender;
     var counter = (Counter)button.DataContext;
     //...
}

Basically DataContext is by default inherited from the parent unless you specify otherwise, so in this case DataContext is the current list item.

Upvotes: 3

Related Questions