【问题标题】:File Browser Dialog MVVM C#, return complete path to view model and diplay only file name in view文件浏览器对话框 MVVM C#​​,返回视图模型的完整路径并在视图中仅显示文件名
【发布时间】:2018-10-09 15:51:35
【问题描述】:

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

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);
        }

    }
}

这是视图中的绑定

<TextBox x:Name="gdbName" HorizontalAlignment="Left" Height="30" Margin="56,29,0,0"  Text="{Binding FolderName, Mode=TwoWay}" VerticalAlignment="Top" Width="282" AllowDrop="True">
        </TextBox>

在 ViewModel 中我有 FolderName 属性

private string _folderName;
public string FolderName
{
   get { return _folderName; }
   set
      {
        _folderName = value;
       OnPropertyChanged("FolderName");
      }
}      

一切正常,但路径名太长,有时会被隐藏。我想显示文件名并传递完整路径。

【问题讨论】:

  • 你为什么不创建一个包含你需要的东西的新对象呢?在这种情况下,文件名和完整路径。

标签: c# wpf mvvm


【解决方案1】:

如果您显示缩短的路径或文件名但让用户输入完整路径,这是不可能的,或者至少非常复杂......

我会使用两个不同的字段或使用OneWay Binding 并让用户只选择带有FileOpenDialog 的新文件,但不让他手动输入路径...

因此,您在视图模型中创建另一个属性,例如:

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

【讨论】:

  • 完美运行
猜你喜欢
  • 2014-02-13
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
相关资源
最近更新 更多