您好我是C#和WPF的新手。以下是未经测试的示例。
让我说我有
String path1 = "C:\Users\user\Desktop\File.ext"
String path2 = "C:\temp\text.txt"
String.Format(path1.Substring(path1.LastIndexOf('\')+1))
String.Format(path2.Substring(path1.LastIndexOf('\')+1))
我想从路径中获取文件名而不更改原始字符串,我想在XAML中执行此操作或执行值转换器。
我正在调查这个以了解我是否应该在一个Observable集合和ListView之间进行值转换,或者只是坚持使用两个列表。一个用于手动包含模型中的文件路径,另一个用于在ListView中显示并单独更新(当前方法)。
我的数据模型
private List<String> AttachedFiles;
public ObservableCollection<String> fileNames { get; set; }
public void addFilePath(String filePath) {
this.AttachedFiles.Add(filePath);
}
public void removeFilePath(String filePath)
{
this.AttachedFiles.Remove(filePath);
}
xaml
<ListView x:Name="DropList" ItemsSource="{Binding fileNames}"
我包含了非常少的代码,因为我正在考虑重构,只是给出了一个想法。我可以在String.Format中使用String方法在XAML中进行dipsplaying,这样它在模型中仍然会有原始的filepath值,或者String.Format是否有一些语法来执行此操作?
EDIT 答案是重复的,但我问是否可以使用Trim Substring Etc等方法在XAML转换器中使用String.Format,如果我应该重构我的代码,但正确地创建它会产生比删除更多的代码和复杂性。
编辑2 这是代码。基本上,列表视图有一个X图标和文本名称旁边的文本,如果用户点击它将调用它的图标:
private void r1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Rectangle r = sender as Rectangle;
ticket.removeFilePath(r.DataContext.ToString());
ticket.fileNames.Remove(r.DataContext.ToString());
}
答案 0 :(得分:1)
使用一个集合,不要使用List<T>
:
ObservableCollection<String> FilePaths { get; private set; }
如果您更换了该集合,则需要引发INotifyPropertyChanged.PropertyChanged
。
写一个值转换器(好的,只是偷我的):
public class FileName : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider) => this;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return System.IO.Path.GetFileName(value.ToString());
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
并在DataTemplate
中使用值转换器。由于FilePaths
是String
的集合,因此DataContext
的{{1}}将是DataTemplate
,因此绑定不会为绑定指定属性使用。传递给值转换器的值将是字符串本身。
String
答案 1 :(得分:1)
如果您在这里只处理一个属性,您可以使用转换器作为建议的其他答案。但您也可以为Path
对象创建一个新类,并在此类中定义FilePath
字符串属性以存储完整路径。 (如果需要,还有更多属性。)
然后,您可以覆盖此类中的ToString
方法,只返回filename
。
通过执行此操作,您无需更改XAML,但绑定列表将仅显示项目作为覆盖ToString
方法返回的结果。
类似的东西:
public ObservableCollection<MyPath> fileNames { get; set; }
public class MyPath: ObservableObject //implement INotifyPropertyChanged
{
private string _filepath;
public string FilePath
{
get { return _filepath; }
set
{
if (value != _filepath)
{
_filepath= value;
RaisePropertyChanged("FilePath");
}
}
}
public override string ToString()
{
return System.IO.Path.GetFileName(FilePath);
}
}