File Browser Dialog MVVM C #, возвращает полный путь для просмотра модели и отображает только имя файла в представлении - PullRequest
0 голосов
/ 09 октября 2018

У меня есть диалоговое окно, и мне нужно вернуть полный путь к файлу моей модели представления, и я хотел бы сделать это, но показывать только имя файла в текстовом поле для просмотра пользователем.У меня есть класс поведения и viewmodel и представление.Я попытался перехватить имя как свойство в классе поведения, но я не получаю значение, когда привязываюсь к текстовому полю, чтобы проверить вывод.Вот диалог браузера

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

все работаетно имена путей настолько длинные, что иногда они скрыты.Я хотел бы показать имя файла и пройти полный путь.

1 Ответ

0 голосов
/ 10 октября 2018

Это невозможно или, по крайней мере, очень сложно, если вы отображаете сокращенный путь или имя файла, но позволяете пользователю ввести полный путь ...

Я бы использовал два разных поля или привязку OneWay и позволил бы пользователю тольковыберите новый файл с помощью 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" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...