【问题标题】:WPF Binding: How to bind a name from a list of filepaths to text of TextBlock in ListBox?WPF 绑定:如何将文件路径列表中的名称绑定到 ListBox 中 TextBlock 的文本?
【发布时间】: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);

【问题讨论】:

    标签: c# wpf list data-binding listbox


    【解决方案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>
      

      【讨论】:

      • 太棒了,正是我想要的,非常感谢!
      猜你喜欢
      • 2011-01-01
      • 2013-01-15
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多