WPF FolderBrowserDialog с использованием Model-View-ViewModel (MVVM) в C#

Мне нужно получить FolderBrowserDialog после того, как я нажму кнопку обзора, но я должен добиться этого с помощью MVVM.

Объяснение:

  1. Как только я получу FolderBrowserDialog Box, я смогу выбрать папку, в которой я хочу сохранить свои файлы.

  2. Затем после выбора папки он должен показать мне выбранный путь к папке вместе с именем папки в текстовом поле рядом с моей кнопкой просмотра.

    Как я могу этого добиться ....

В обязанности vm не входит показывать диалог файлов. Вы должны сделать это в коде, а затем использовать vm из свойства DataContext для вызова метода в vm

FCin 04.01.2019 07:47

Напишите метод в своем коде с помощью OpenFileDialog и в том же методе приведите (YourVM)DataContext и вызовите метод в виртуальной машине из него. Вот и все.

FCin 04.01.2019 08:18

Нет, я прошу FolderBrowserDialog, а не OpenFileDialog ... Оба они разные, правда? @FCin

GJPD 04.01.2019 08:49

Вы можете проверить моя статья и код в диалоговых окнах MVVM. Исходя из памяти, я не думаю, что я специально добавил средство выбора диалогового окна папки, но если бы это было не так, нужно было бы добавить всего несколько строк, если вы основываете его на варианте для OpenFileDialog.

Mark Feldman 04.01.2019 09:25

@MarkFeldman Лучшее решение на ТАК. Мне нравится идея инкапсулировать логику диалога в поведение. Это делает диалоговую обработку многоразовой и сохраняет ее в области представления. Вам обязательно стоит посвятить этому ответ. В противном случае будет слишком много плохих рекомендаций, таких как обработка диалоговых элементов управления в модели представления.

BionicCode 04.01.2019 10:03

@MarkFeldman Прикрепленное поведение - это элегантный способ сделать логику кода программной части многоразовой и расширяемой.

BionicCode 04.01.2019 10:13

@Bionic спасибо! Однако ссылки на самом деле не считаются ответами на SO, а мой содержит много информации, которая не вписывается в формат вопроса / ответа SO. Однако оцените комментарий.

Mark Feldman 04.01.2019 10:35

@MarkFeldman Очень жаль, что люди ищут ТАК, прежде чем искать в Интернете такие статьи. Хотя SO также помог мне в начале, я думаю, что если бы у меня была компания, я бы заблокировал URL-адрес. В процессе производства я наблюдал столько копий и вставок плохого кода, что вызывало много трудоемких проблем. Все из-за отсутствия какого-то элементарного понимания. Я работал с разработчиками, которые не могли понять свой собственный код и поэтому не могли его исправить. В качестве оправдания они сказали, что это было скопировано с SO. Я буду рекомендовать вашу статью всякий раз, когда эта тема снова поднимется. И обязательно будет.

BionicCode 04.01.2019 11:26

@Bionic, конечно, проблема. Раньше я руководил компанией-разработчиком программного обеспечения, и мои два правила для вырезания-и-вставки (будь то SO или где-то еще) были: 1) дать каждой строчке хотя бы приблизительный взгляд, чтобы убедиться, что она делает то, что вы думаете. делает, и 2) добавьте URL-адрес, с которого вы его получили, вверху, чтобы все хотя бы знали, откуда он. Если вы также проводите проверку кода, тогда это должно выявить большинство проблем, без потери времени / денег на принудительную перезапись всего.

Mark Feldman 04.01.2019 11:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
547
1

Ответы 1

Вам нужно узнать о привязке.

В этом простом примере я добавил кнопку, которая привязана к команде, которая заменяет код, стоящий за событием. Я также использовал в Nuget, который сохранил ICommand и реализовал его (вместе с множеством других функций) - Имя Nuget это Prism6.MEF.

Вот пример:

Xaml:

    <Grid>
    <StackPanel>
        <TextBlock Text = "{Binding BindableTextProperty}" />
        <Button Content  = "Do Action" Command = "{Binding DoAction}" Height = "50"/>
    </StackPanel>

</Grid>

Код позади:

    /// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowVM();
    }
}

Просмотреть модель:

   class MainWindowVM : BindableBase
{
    private string m_bindableTextProperty;


    public MainWindowVM() 
    {
        DoAction = new DelegateCommand(ExecuteDoAction,CanExecuteDoAction); 
    }


    public string BindableTextProperty
    {
        get { return m_bindableTextProperty; }
        set { SetProperty(ref m_bindableTextProperty , value); }
    }

    public DelegateCommand DoAction
    {
        get;
        private set;
    }

    private bool CanExecuteDoAction()
    {
        return true;
    }

    private void ExecuteDoAction() 
    { 
      // Do something
      // You could enter the Folder selection code here 
        BindableTextProperty = "Done"; 
    }
}

Как я объяснил в начале, чтобы понять, почему это работает, вы должны понимать привязку в WPF и особенно INotifyPropertyChange - для данных в TextBlock

Надеюсь, это помогло :)

Другие вопросы по теме