我正在尝试在UWP中进行一些基本的UI和绑定,以使自己陷入困境,但是我无法访问列表视图项中的按钮。
我有一个Button,单击它会创建一个新对象,该对象添加到我的ObservableCollection中,然后最终在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());
}
}
那行得通。
但是当我单击StackPanel中的按钮时,调用了Increment_Click方法,但是我不确定此时该怎么做。我想通过获取ListView项的索引并使用它来索引ObservableCollection来访问Counter对象。
如何确定添加的ListView项的索引是什么?
答案 0 :(得分:2)
您应该使用Command
和CommandParameter
而不是事件。然后,您将Command
绑定到在Counter
中实现的命令,并将CommandParameter
绑定到该项(例如{Binding}
)。
但是,您可以通过Click
事件和DataContext
来实现自己的目标:
private void Increment_Click(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
var counter = (Counter)button.DataContext;
//...
}
默认情况下,除非您另外指定,否则默认情况下DataContext
基本上是从父级继承的,因此在这种情况下DataContext
是当前列表项。