Мне нужно получить FolderBrowserDialog после того, как я нажму кнопку обзора, но я должен добиться этого с помощью MVVM.
Объяснение:
Как только я получу FolderBrowserDialog Box, я смогу выбрать папку, в которой я хочу сохранить свои файлы.
Затем после выбора папки он должен показать мне выбранный путь к папке вместе с именем папки в текстовом поле рядом с моей кнопкой просмотра.
Как я могу этого добиться ....
Напишите метод в своем коде с помощью OpenFileDialog и в том же методе приведите (YourVM)DataContext и вызовите метод в виртуальной машине из него. Вот и все.
Нет, я прошу FolderBrowserDialog, а не OpenFileDialog ... Оба они разные, правда? @FCin
Вы можете проверить моя статья и код в диалоговых окнах MVVM. Исходя из памяти, я не думаю, что я специально добавил средство выбора диалогового окна папки, но если бы это было не так, нужно было бы добавить всего несколько строк, если вы основываете его на варианте для OpenFileDialog.
@MarkFeldman Лучшее решение на ТАК. Мне нравится идея инкапсулировать логику диалога в поведение. Это делает диалоговую обработку многоразовой и сохраняет ее в области представления. Вам обязательно стоит посвятить этому ответ. В противном случае будет слишком много плохих рекомендаций, таких как обработка диалоговых элементов управления в модели представления.
@MarkFeldman Прикрепленное поведение - это элегантный способ сделать логику кода программной части многоразовой и расширяемой.
@Bionic спасибо! Однако ссылки на самом деле не считаются ответами на SO, а мой содержит много информации, которая не вписывается в формат вопроса / ответа SO. Однако оцените комментарий.
@MarkFeldman Очень жаль, что люди ищут ТАК, прежде чем искать в Интернете такие статьи. Хотя SO также помог мне в начале, я думаю, что если бы у меня была компания, я бы заблокировал URL-адрес. В процессе производства я наблюдал столько копий и вставок плохого кода, что вызывало много трудоемких проблем. Все из-за отсутствия какого-то элементарного понимания. Я работал с разработчиками, которые не могли понять свой собственный код и поэтому не могли его исправить. В качестве оправдания они сказали, что это было скопировано с SO. Я буду рекомендовать вашу статью всякий раз, когда эта тема снова поднимется. И обязательно будет.
@Bionic, конечно, проблема. Раньше я руководил компанией-разработчиком программного обеспечения, и мои два правила для вырезания-и-вставки (будь то SO или где-то еще) были: 1) дать каждой строчке хотя бы приблизительный взгляд, чтобы убедиться, что она делает то, что вы думаете. делает, и 2) добавьте URL-адрес, с которого вы его получили, вверху, чтобы все хотя бы знали, откуда он. Если вы также проводите проверку кода, тогда это должно выявить большинство проблем, без потери времени / денег на принудительную перезапись всего.





Вам нужно узнать о привязке.
В этом простом примере я добавил кнопку, которая привязана к команде, которая заменяет код, стоящий за событием. Я также использовал в 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
Надеюсь, это помогло :)
В обязанности vm не входит показывать диалог файлов. Вы должны сделать это в коде, а затем использовать vm из свойства DataContext для вызова метода в vm