我有一个ListBox
,其中的项目包含TextBlock
,Button
和Image
。我的Click
上有一个Button
方法,但我的问题是它在Item
的{{1}}发生变化之前就会触发。这是我的ListBox
;
ListBox
点击其中一个<ListBox x:Name="imageListBox" ItemsSource="{Binding CCTVImageCollection}" HorizontalAlignment="Center">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:CCTVImage}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding PictureName}" FontSize="20" FontWeight="Bold" HorizontalAlignment="Left" Margin="5"/>
<Button Grid.Column="1" Content="Directory" FontSize="16" HorizontalAlignment="Right" Margin="5" Click="OnDirectoryButtonClick"/>
<Button Grid.Column="2" Content="Live Feed" FontSize="16" HorizontalAlignment="Right" Margin="5" Click="OnCCTVButtonClick"/>
<Image Grid.Row="1" Grid.ColumnSpan="3" Source="{Binding PicturePath}" Height="400" Width="600" VerticalAlignment="Top"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
;
Buttons
正如您所看到的,该方法依赖于private void OnCCTVButtonClick(object sender, RoutedEventArgs e)
{
var selectedItem = imageListBox.SelectedItem as CCTVImage;
if (selectedItem != null)
{
Process.Start("chrome.exe", selectedItem.CCTVPath);
}
}
,因为当ListBox.SelectedItem
被点击时这不会改变,Button
被处理为空并且没有任何反应。如何强制执行SelectedItem
点击的SelectedItem
更改?
答案 0 :(得分:1)
希望您没有找到任何解决方案。
通常在这种情况下,我所做的是在选择列表项之前禁用按钮或从单击按钮的容器中获取列表项。试试这个。它应该工作。
private void OnCCTVButtonClick(object sender, RoutedEventArgs e)
{
var selectedItem = ((ListBoxItem)imageListBox.ContainerFromElement((Button)sender)).Content as CCTVImage;
if (selectedItem != null)
{
Process.Start("chrome.exe", selectedItem.CCTVPath);
}
}
您还可以通过在按钮单击期间从可视树中查找可视祖先来获取单击的列表项。