有没有办法让 selectionchanged 事件在每次单击列表视图中的选择时触发,而不是仅在它更改时触发?
例如,假设我有一个列表视图,其中只有一个对象。用户单击该对象,该对象包含填充下面一些文本框的信息。用户开始更改这些文本框中的一些值(未绑定到对象)。然后他们决定不想要这些文本框中的内容,因此他们想将所有内容重置为列表视图中对象中的内容。但是当他们单击列表视图中的一个对象时,什么也没有发生,因为选择没有改变。
希望这是有道理的。任何人都知道我该如何解决这个问题?
有没有办法让 selectionchanged 事件在每次单击列表视图中的选择时触发,而不是仅在它更改时触发?
例如,假设我有一个列表视图,其中只有一个对象。用户单击该对象,该对象包含填充下面一些文本框的信息。用户开始更改这些文本框中的一些值(未绑定到对象)。然后他们决定不想要这些文本框中的内容,因此他们想将所有内容重置为列表视图中对象中的内容。但是当他们单击列表视图中的一个对象时,什么也没有发生,因为选择没有改变。
希望这是有道理的。任何人都知道我该如何解决这个问题?
如果项目已被选中,则 ListView.SelectionChanged 和 ListViewItem.Selected 事件不会重新触发。如果您需要重新触发它,您可以在事件触发时“取消选择”该项目。
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in e.AddedItems.OfType<ListViewItem>())
{
Trace.WriteLine("ListViewItem Selected");
item.IsSelected = false;
}
}
因此,您可以重新选择它,令人作呕。但是,如果您不需要实际选择,那么您应该使用ItemsControl。
如果您确实想保持项目的选择能力,那么您应该考虑注册到与 ListView.SelectionChanged 或 ListView.Selected 不同的事件。PreviewMouseDown 对此效果很好,就像我们希望它在左键和右键单击时发生的初始项目选择一样。我们可以将它附加到单个 ListViewItem,但由于列表可能在某些时候获得更多项目,因此我们可以使用 ListView 的 ItemContainerStyle 属性将其分配给所有项目。
<ListView SelectionChanged="ListView_SelectionChanged">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="PreviewMouseDown"
Handler="ListViewItem_PreviewMouseDown" />
</Style>
</ListView.ItemContainerStyle>
<ListViewItem>Item 1</ListViewItem>
<ListViewItem>Item 2</ListViewItem>
<ListViewItem>Item 3</ListViewItem>
<ListViewItem>Item 4</ListViewItem>
</ListView>
private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Trace.WriteLine("ListViewItem Clicked: " + (sender as ListViewItem).Content);
}
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(ListView.SelectedIndex != -1)
{
//to do staff
}
ListView.SelectedIndex = -1;
}
我们也可以使用这个!
<ListView x:Name="ListView"
Height="Auto" SelectionChanged="ListView_OnSelectionChanged"
Width="260"
Margin="0,-12,0,-25">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding name_to_show_menu,Mode=TwoWay}" Tapped="UIElement_OnTapped"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在后面的代码中
private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e)
{
//this fire every time
}