WPF 绑定:如何将文件路径列表中的名称绑定到 ListBox 中 TextBlock 的文本?

Posted

技术标签:

【中文标题】WPF 绑定:如何将文件路径列表中的名称绑定到 ListBox 中 TextBlock 的文本?【英文标题】:WPF Binding: How to bind a name from a list of filepaths to text of TextBlock in ListBox? 【发布时间】:2015-11-14 08:15:59 【问题描述】:

我正在尝试将文件路径给定的文件名绑定到 TextBlock。文件路径存储在绑定到 ListBox 的 ItemsSourceProperty 的列表中。 TextBlock 设置为 DataTemplate。 我的问题是:如何获取没有路径和扩展名的名称并将其绑定到 TextBlock?

XAML 代码以获得更好的解释:

<ListBox Name="MyListBox" Margin="2">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

以及背后的代码:

string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
List<string> PathList = Directory.GetFiles(path, "*.txt").ToList();

Binding myBind = new Binding();
myBind.Source = PathList;

myListBox.SetBinding(ListBox.ItemsSourceProperty, myBind);

【问题讨论】:

【参考方案1】:

如果您只想将静态列表添加到列表框,您应该这样做。

XAML

    <ListBox x:Name="lb" ItemsSource="Binding Collection">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="Binding" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

主窗口中构造函数背后的代码:

        public MainWindow()
        
            InitializeComponent();

            List<string> l = new List<string>();
            l.Add("string path 1");
            l.Add("string path 2");
            l.Add("string path 3");
            l.Add("string path 4");
            lb.ItemsSource = l;

        

您应该知道有更好的方法来做这些事情。老实说,我建议您查看 MVVM 并正确绑定到 ViewModel。

【讨论】:

【参考方案2】:

使用转换器更改选定列表框项目的文本,该列表框项目完全路径为文件名。

在以下示例中,旁边有一个列表和一个文本框。一旦选择了一个项目,绑定到列表SelectedItem 的文本框会提取路径字符串,该字符串传递给转换器,该转换器仅返回要显示的文件名。

示例

XAML

<Window x:Class="WPFStack.ListBoxQuestions"
 xmlns:local="clr-namespace:WPFStack"
 xmlns:converters="clr-namespace:WPFStack.Converters"
.../>

<StackPanel Orientation="Horizontal">
    <StackPanel.Resources>
        <converters:PathToFilenameConverter x:Key="FilenameConverter" />

        <x:Array x:Key="FileNames" Type="system:String">
            <system:String>C:\Temp\Alpha.txt</system:String>
            <system:String>C:\Temp\Beta.txt</system:String>
        </x:Array>

    </StackPanel.Resources>

    <ListBox  Name="lbFiles"
              ItemsSource="StaticResource FileNames" />

    <TextBlock Text="Binding SelectedItem, 
                              ElementName=lbFiles,
                              Converter=StaticResource FilenameConverter"
                Margin="6,0,0,0" />

</StackPanel>

转换器

namespace WPFStack.Converters

public class PathToFilenameConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        object result = null;

        if (value != null)
        
            var path = value.ToString();

            if (string.IsNullOrWhiteSpace(path) == false)
                result = Path.GetFileNameWithoutExtension(path);
        

        return result;

    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        return value;
    



转换器的ItemTemplate使用

转换器在模板中被重用

 <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="Binding Converter=StaticResource FilenameConverter"/>
        </DataTemplate>
  </ListBox.ItemTemplate>

【讨论】:

太棒了,正是我想要的,非常感谢!

以上是关于WPF 绑定:如何将文件路径列表中的名称绑定到 ListBox 中 TextBlock 的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串列表数据绑定到 WPF/WP7 中的 ListBox?

在WPF中怎么将ComboBox的下拉列表的数据进行绑定?还有能不能TXT文件中的列表?

如何创建静态可绑定属性描述对象

在WPF使用中读取一个配置文件获得一个结构体list,然后将数据绑定到Combobox下拉列表框中,如何实现?

选定的 WPF 列表框绑定仅更新视图中的项目

如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox