String.Format是否可以在XAML

时间:2016-09-20 14:34:32

标签: c# wpf xaml string.format

您好我是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());
    }

2 个答案:

答案 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中使用值转换器。由于FilePathsString的集合,因此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);
    }
}