Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
文件浏览器对话框MVVM C#,返回视图模型的完整路径,并在视图中仅显示文件名_C#_Wpf_Mvvm - Fatal编程技术网

文件浏览器对话框MVVM C#,返回视图模型的完整路径,并在视图中仅显示文件名

文件浏览器对话框MVVM C#,返回视图模型的完整路径,并在视图中仅显示文件名,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个对话框窗口,我需要返回一个完整的文件路径到我的viewmodel,我想这样做,但在视图中的文本框中只显示文件名供用户使用。我有一个行为类、一个视图模型和一个视图。我尝试在behaviors类中将该名称作为属性捕获,但当我绑定到文本框以检查输出时,无法获取该值。这是浏览器对话框 namespace BasemapCreator.Behaviors { public class FolderDialogBehavior:Behavior<System.Windows.Contr

我有一个对话框窗口,我需要返回一个完整的文件路径到我的viewmodel,我想这样做,但在视图中的文本框中只显示文件名供用户使用。我有一个行为类、一个视图模型和一个视图。我尝试在behaviors类中将该名称作为属性捕获,但当我绑定到文本框以检查输出时,无法获取该值。这是浏览器对话框

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" />