WPF FolderBrowserDialog с использованием MVVM (без кода позади) - PullRequest
0 голосов
/ 08 января 2019

Пояснение: Я должен получить FolderBrowserDialog Box, как только я нажму кнопку обзора. И в FolderBrowserDialog Box, если я выберу любую папку и нажму ok, этот конкретный путь к папке вместе с foldername должен быть показан в текстовом поле рядом с кнопкой обзора .... Но я ничего не получил, когда нажал кнопку Обзор. Пожалуйста, проверьте мой код и исправьте меня ...

View.xaml :

<Window....  xmlns:VM="clr-namespace:myproject.myViewModel"
...  >
<Window.DataContext><VM:myViewModel/>
<Grid>...
<TextBlock  Text="Folder to save files"  VerticalAlignment="Center" />
<TextBox   Text="{Binding Path=FoldernameWithPath  , UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"   Height="26"    IsReadOnly="True"  VerticalContentAlignment="Center"    Width="150"    />
 <Button      Content="Browse"    Height="26" VerticalAlignment="Bottom"  MinWidth="45"  Command="{Binding OpenFolderCommand}" />
</Grid>
</window> 

ViewModel.cs

    public ICommand OpenFolderCommand
    {
        get => new RelayCommand(a => this.OpenFolder(), p => CanOpenFolder());
    }
    private string _foldernameWithPath;
    public string FoldernameWithPath
    {
        get { return _foldernameWithPath; }
        set
        {
            if (value == _foldernameWithPath)
            {
                return;
            }
            else
            {
                _foldernameWithPath = value;
                OnPropertyChanged("FoldernameWithPath");
            }
        }
    }
    public bool CanOpenFolder()
    {
        return true;
    }
    private void OpenFolder()
    {
        FolderBrowserDialog openFolderDialog = new FolderBrowserDialog();
        if (openFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK && OpenFolderCommand.CanExecute(openFolderDialog.SelectedPath))
        {
            OpenFolderCommand.Execute(openFolderDialog.SelectedPath);
            FoldernameWithPath = openFolderDialog.SelectedPath;
        }
    }

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Выполните следующие изменения,

In View.xaml

<Button Content="Browse" Command="{Binding OpenFolderCommand}"/>

В ViewModel.cs

public bool CanOpenFolder()
{
    return true;
}

private void OpenFolder()
{
    FolderBrowserDialog openFolderDialog = new FolderBrowserDialog();
    if (openFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK && OpenFolderCommand.CanExecute(openFolderDialog.SelectedPath))
    {
        //OpenFolderCommand.Execute(openFolderDialog.SelectedPath);
        FoldernameWithPath = openFolderDialog.SelectedPath;
    }
}
0 голосов
/ 08 января 2019

Вы не должны вызывать команду из делегированного метода (OpenFolder()). Команда не выполняет ничего, кроме выполнения делегированного метода при вызове Execute, что выполняется автоматически при нажатии кнопки.

Также ICommand.CanExecute() обычно вызывается автоматически самим WPF и в зависимости от результата только включает или отключает кнопку. Вы редко вызываете CanExecute самостоятельно во ViewModel. В вашем случае вы хотите, чтобы кнопка всегда была включена, поэтому вы можете пропустить CanExecute или использовать выражение p => true.

Это должно работать

XAML:

<TextBox Text="{Binding Path=FoldernameWithPath}" IsReadOnly="True" />
<Button Content="Browse"  Command="{Binding OpenFolderCommand}" />

ViewModel:

public ICommand OpenFolderCommand {get;} = new RelayCommand(p => OpenFolder());

private string _foldernameWithPath;
public string FoldernameWithPath
{
    get { return _foldernameWithPath; }
    set
    {
        if (value == _foldernameWithPath) return
        _foldernameWithPath = value;
        OnPropertyChanged("FoldernameWithPath");
    }
}

public void OpenFolder()
{
   FolderBrowserDialog openFolderDialog = new FolderBrowserDialog();
   if (openFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
   {
      FoldernameWithPath = openFolderDialog.SelectedPath;
   }
}
0 голосов
/ 08 января 2019

Я бы написал команду так:

public ICommand OpenFolderCommand { get; private set; }
public MyViewModel() 
{
    this.OpenFolderCommand = new RelayCommand(a=> this.OpenFolder(),p=> CanOpenFolder());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...