如何选择ListBox中的项目并从WPF中的DataTemplate中选择项目的名称

时间:2014-10-19 18:53:44

标签: c# .net wpf mvvm

我正在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中删除一个条目。但我在click事件中没有File Name(我知道click事件不是MVVM,我仍然希望在click事件处理程序中执行它。)

有人建议在FileName取消后如何获取该特定文件的selectedItem。在

private void ButtonCancel_Click(...) {}

1 个答案:

答案 0 :(得分:1)

虽然我仍然鼓励您使用MVVM way of dealing with UI events,但您可以使用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; }
    }