文件浏览器对话框MVVM C#,返回视图模型的完整路径,并在视图中仅显示文件名
我有一个对话框窗口,我需要返回一个完整的文件路径到我的viewmodel,我想这样做,但在视图中的文本框中只显示文件名供用户使用。我有一个行为类、一个视图模型和一个视图。我尝试在behaviors类中将该名称作为属性捕获,但当我绑定到文本框以检查输出时,无法获取该值。这是浏览器对话框文件浏览器对话框MVVM C#,返回视图模型的完整路径,并在视图中仅显示文件名,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个对话框窗口,我需要返回一个完整的文件路径到我的viewmodel,我想这样做,但在视图中的文本框中只显示文件名供用户使用。我有一个行为类、一个视图模型和一个视图。我尝试在behaviors类中将该名称作为属性捕获,但当我绑定到文本框以检查输出时,无法获取该值。这是浏览器对话框 namespace BasemapCreator.Behaviors { public class FolderDialogBehavior:Behavior<System.Windows.Contr
namespace BasemapCreator.Behaviors
{
public class FolderDialogBehavior:Behavior<System.Windows.Controls.Button>
{
public void FolderBrowserDialog()
{
}
public string SetterName { get; set; }
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Click += OnClick;
}
protected override void OnDetaching()
{
AssociatedObject.Click -= OnClick;
}
private void OnClick(object sender, RoutedEventArgs e)
{
var dialog = new FolderBrowserDialog();
var result = dialog.ShowDialog();
if (result == DialogResult.OK && AssociatedObject.DataContext != null)
{
var propertyInfo = AssociatedObject.DataContext.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)
.Where(p => p.CanRead && p.CanWrite)
.First(p => p.Name.Equals(SetterName));
string dirName = new DirectoryInfo(dialog.SelectedPath).Name;
FolderName = dirName;
_fileName = System.IO.Path.GetFileName(dirName);
FileName = _fileName;
ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(FileName.ToString());
propertyInfo.SetValue(AssociatedObject.DataContext, dialog.SelectedPath, null);
}
}
private string _folderName;
public string FolderName
{
get { return _folderName; }
set
{
if (value != _folderName )
{
_folderName = value;
OnPropertyChanged("FolderName");
}
}
}
private string _fileName;
public string FileName
{
get { return _fileName; }
set
{
if (_fileName != value)
{
_fileName = value;
OnPropertyChanged("FileName");
}
}
}
private string _styleName;
public string StyleName
{
get { return _styleName; }
set
{
if (_styleName != value)
{
_styleName = value;
OnPropertyChanged("StyleName");
}
}
}
private void OnPropertyChanged(string propertyname)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyname));
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(PropertyChangedEventArgs args)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, args);
}
}
}
一切正常,但路径名太长,有时会隐藏起来。我想显示文件名并传递完整路径 如果显示缩短的路径或文件名,但让用户输入完整路径,则不可能或至少非常复杂 我会使用两个不同的字段,或者使用一个
单向
绑定
,让用户只使用文件打开对话框
选择一个新文件,但不允许用户手动输入路径
因此,可以在视图模型中创建另一个属性,如:
public string SortenedFolderName => Path.GetFileName(_folderName);
private string _folderName;
public string FolderName
{
get { return _folderName; }
set
{
_folderName = value;
OnPropertyChanged(nameof(FolderName));
OnPropertyChanged(nameof(SortenedFolderName));
}
}
并绑定到该属性,如:
<TextBox Text="{Binding SortenedFolderName, Mode=OneWay}" IsReadOnly="True" />
为什么不创建一个包含所需内容的新对象?在本例中,文件名和完整路径
public string SortenedFolderName => Path.GetFileName(_folderName);
private string _folderName;
public string FolderName
{
get { return _folderName; }
set
{
_folderName = value;
OnPropertyChanged(nameof(FolderName));
OnPropertyChanged(nameof(SortenedFolderName));
}
}
<TextBox Text="{Binding SortenedFolderName, Mode=OneWay}" IsReadOnly="True" />