如何在ListBox中选择项目并选择项目';的名称来自WPF中的DataTemplate

本文关键字:选择 项目 DataTemplate 中的 WPF ListBox | 更新日期: 2023-09-27 18:27:00

我正在WPF中实现一个下载UI,其中正在下载的每个文件都将显示在DataTemplate 的列表框中

<ListBox>
   <ListBox.ItemTemplate>
      <DataTemplate> 
         <TextBlock x:Name="FileName" text={Binding FileName}" />
         <ProgressBar ... />
         <Button Content="Cancel" click="ButtonCancel_Click" />
      </DataTemplate>
   </ListBox.ItemTemplate>
<ListBox>

现在,这个列表已经完美地填充了所有的下载信息。我遇到的唯一问题是,当用户单击Cancel按钮时,要取消下载,我必须从ObservableCollections中删除一个条目。但我在点击事件中没有File Name(我知道点击事件不是MVVM,但我仍然想在点击事件处理程序中进行)。

selectedItem被取消时,有人能建议我如何获得该特定文件的FileName吗。在

private void ButtonCancel_Click(...) {}

如何在ListBox中选择项目并选择项目';的名称来自WPF中的DataTemplate

尽管我仍然鼓励您使用MVVM来处理UI事件,但以下是如何使用Cancel按钮的单击事件处理程序来实现您想要的内容。

首先在您的xaml中,将bind文件名设置为Cancel按钮的Tag属性。

<ListBox>
   <ListBox.ItemTemplate>
      <DataTemplate> 
         <TextBlock x:Name="FileName" text={Binding FileName}" />
         <ProgressBar ... />
         <Button Content="Cancel" Tag="{Binding FileName}" 
                 Click="ButtonCancel_Click" />
      </DataTemplate>
   </ListBox.ItemTemplate>
<ListBox>

然后在点击事件处理程序中

private void ButtonCancel_Click(object sender, RoutedEventArgs e) 
{
   Button myButton = (Button)sender;
   string fileName = myButton.Tag.ToString();
   // use fileName
}

编辑

只是添加一个完整的例子,它在本地进行了测试,并确保了它的有效性。

XAML

<Window x:Class="WpfTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListBox Name="listBox1">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock x:Name="FileName" Text="{Binding Path=FileName}" />
                         <Button Content="Cancel" Tag="{Binding Path=FileName}" 
                                 Click="ButtonCancel_Click" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

代码隐藏

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var fileNames = new List<DownloadModel>
            {
                new DownloadModel
                {
                    FileName = "File1"
                }, 
                new DownloadModel
                {
                    FileName = "File2"
                }, 
                new DownloadModel
                {
                    FileName = "File3"
                }
            };
            listBox1.ItemsSource = fileNames;
        }
        private void ButtonCancel_Click(object sender, RoutedEventArgs e)
        {
            var myButton = sender as Button;
            if (myButton.Tag == null)
            {
                MessageBox.Show("Tag value was null.");
            }
            else
            {
                MessageBox.Show(string.Format("File name is {0}", myButton.Tag));
            }
        }
    }
    public class DownloadModel
    {
        public string FileName { get; set; }
    }