Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-如何正确显示与字符串列表绑定的文本块中的文本_C#_Wpf_Gridview_Data Binding - Fatal编程技术网

C# WPF-如何正确显示与字符串列表绑定的文本块中的文本

C# WPF-如何正确显示与字符串列表绑定的文本块中的文本,c#,wpf,gridview,data-binding,C#,Wpf,Gridview,Data Binding,对于未来的专业项目,我需要评估WPF功能 在这个上下文中,我创建了一个小测试项目,它包含一个字符串树和一个图像网格。我希望我的图像网格显示给定目录中包含的所有jpeg图像,对于每个图像,在图像下方显示提取的文件名,而不显示其路径和扩展名 事实上,根据我的目标,我的演示正常工作,除了一点:我添加了每个格式化文件名以显示在列表集合中,我尝试用每个图像底部显示的文本块绑定列表集合。但是,这个格式化的名称是不可见的,相反,我看到的是完整的文件名,就像TextBlock直接从图像对象中提取它一样 我试着自

对于未来的专业项目,我需要评估WPF功能

在这个上下文中,我创建了一个小测试项目,它包含一个字符串树和一个图像网格。我希望我的图像网格显示给定目录中包含的所有jpeg图像,对于每个图像,在图像下方显示提取的文件名,而不显示其路径和扩展名

事实上,根据我的目标,我的演示正常工作,除了一点:我添加了每个格式化文件名以显示在列表集合中,我尝试用每个图像底部显示的文本块绑定列表集合。但是,这个格式化的名称是不可见的,相反,我看到的是完整的文件名,就像TextBlock直接从图像对象中提取它一样

我试着自己解决这个问题,在几个教程之后,什么都不管用。我不知道我做错了什么。有人能给我解释一下吗

这是我的xaml文件内容


还有我的c代码

使用系统;
使用System.Collections.Generic;
使用System.Text.RegularExpressions;
使用System.Windows;
使用System.Windows.Data;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
命名空间虚拟树
{
[值转换(类型(列表)、类型(字符串))]
公共类ListToString转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
if(targetType!=类型(字符串))
抛出新的InvalidOperationException(“目标必须是字符串”);
返回字符串.Join(“,”,((列表)值).ToArray());
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共类用户
{
公共字符串名称{get;set;}
公共整数{get;set;}
公共字符串邮件{get;set;}
}
List m_ImageList=新列表();
List m_ImageNames=新列表();
字符串m|u regexpatern=@“\\([\w]+)。(?:jpg|png)$”;
公共主窗口()
{
初始化组件();
PopulateStringTree();
PopulateImageGrid();
}
public void PopulateStringTree()
{
List vstItems=新列表();
对于(ulong i=0;i<100000;++i)
{
添加(新用户(){Name=“John Doe”,年龄=42岁,邮件=john@doe-family.com“});
添加(新用户(){Name=“Jane Doe”,年龄=39岁,邮件=jane@doe-family.com“});
添加(新用户(){Name=“Sammy Doe”,Age=7,Mail=“Sammy。doe@gmail.com" });
}
lvStringTree.ItemsSource=vstItems;
}
public void PopulateImageGrid()
{
//从目标目录获取jpeg图像文件列表
字符串moviePosterPath=@“W:\Labo\WPF\VirtualTrees\VirtualTrees\Resources\Images”;
列表文件名=新列表(System.IO.Directory.EnumerateFiles(moviePosterPath,*.jpg));
//遍历文件
foreach(文件名中的字符串文件名)
{
//加载图像并将其添加到图像列表
添加(新的位图图像(新的Uri(文件名));
Console.WriteLine(“文件名”+文件名);
//提取图像文件名并将其添加到名称列表
Match regexMatch=Regex.Match(fileName.Trim(),m_regexpatern);
m_ImageNames.Add(regexMatch.Groups[1].Value);
Console.WriteLine(“电影名称:+regexMatch.Groups[1].Value”);
}
//将数据绑定到图像网格
lvImages.ItemsSource=m_ImageList;
}
}
}

您的
数据模板是错误的根源。您必须检查
TextBlock
的绑定。您正在绑定到
DataContext
,它是一个
BitmapSource
TextBlock
隐式调用
BitmapSource.ToString()
以获取类型的字符串表示形式
BitmapSource
已覆盖
ToString()
以返回完整的文件路径。要解决此问题,您需要使用
IValueConverter

修改了
数据模板
TextBlock
绑定现在使用转换器将
BitmapSource
转换为文件名:

<DataTemplate x:Key="itImageCell">
  <WrapPanel>
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="20" />
      </Grid.RowDefinitions>
      <Image Width="120"
             Stretch="Uniform"
             Source="{Binding}" />
      <TextBlock Grid.Row="1"
                 Width="120"
                 Text="{Binding ., Converter={StaticResource BitmapSourceToFilenameConverter}}"
                 TextTrimming="CharacterEllipsis" />
    </Grid>
  </WrapPanel>
</DataTemplate>
[ValueConversion(typeof(BitmapSource), typeof(string))]
public class  BitmapSourceToFilenameConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    if (value is BitmapSource bitmapSource)
      return bitmapSource.UriSource.AbsolutePath;

    return Binding.DoNothing;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    throw new NotImplementedException();
  }
}
我在你的代码中发现了一个小错误:

您首先在
列表视图上设置绑定:

<ListView Name="lvImages" ItemsSource="{Binding Path=m_ImageList}" />
这不是绑定(注释不正确)

您应该将
m_ImageList
a
observedcollection
而不是
List
。添加、移动或删除项目时,将自动更新
列表视图。然后从
main窗口中删除这一行
class:
lvImages.ItemsSource=m_imageslist

您确定您的
// bind data to image grid
lvImages.ItemsSource = m_ImageList;