如何在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(...) {}
尽管我仍然鼓励您使用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; }
}