C# WPF-如何正确显示与字符串列表绑定的文本块中的文本
对于未来的专业项目,我需要评估WPF功能 在这个上下文中,我创建了一个小测试项目,它包含一个字符串树和一个图像网格。我希望我的图像网格显示给定目录中包含的所有jpeg图像,对于每个图像,在图像下方显示提取的文件名,而不显示其路径和扩展名 事实上,根据我的目标,我的演示正常工作,除了一点:我添加了每个格式化文件名以显示在列表集合中,我尝试用每个图像底部显示的文本块绑定列表集合。但是,这个格式化的名称是不可见的,相反,我看到的是完整的文件名,就像TextBlock直接从图像对象中提取它一样 我试着自己解决这个问题,在几个教程之后,什么都不管用。我不知道我做错了什么。有人能给我解释一下吗 这是我的xaml文件内容C# WPF-如何正确显示与字符串列表绑定的文本块中的文本,c#,wpf,gridview,data-binding,C#,Wpf,Gridview,Data Binding,对于未来的专业项目,我需要评估WPF功能 在这个上下文中,我创建了一个小测试项目,它包含一个字符串树和一个图像网格。我希望我的图像网格显示给定目录中包含的所有jpeg图像,对于每个图像,在图像下方显示提取的文件名,而不显示其路径和扩展名 事实上,根据我的目标,我的演示正常工作,除了一点:我添加了每个格式化文件名以显示在列表集合中,我尝试用每个图像底部显示的文本块绑定列表集合。但是,这个格式化的名称是不可见的,相反,我看到的是完整的文件名,就像TextBlock直接从图像对象中提取它一样 我试着自
还有我的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
aobservedcollection
而不是List
。添加、移动或删除项目时,将自动更新列表视图。然后从main窗口中删除这一行class:lvImages.ItemsSource=m_imageslist代码>您确定您的
// bind data to image grid
lvImages.ItemsSource = m_ImageList;