【问题标题】:WPF FolderBrowserDialog using MVVM(without code behind)使用 MVVM 的 WPF FolderBrowserDialog(没有后面的代码)
【发布时间】:2019-01-08 09:33:05
【问题描述】:

说明: 单击浏览按钮后,我必须获取 FolderBrowserDialog Box。在文件夹浏览器对话框中,如果我选择任何文件夹并单击确定,则该特定文件夹路径和文件夹名称应显示在浏览按钮旁边的文本框中......但是一旦我单击浏览按钮,我什么也没有得到。 请检查我的代码并纠正我...

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

【问题讨论】:

  • 尝试省略您的 CanOpenFolder。我认为验证此命令参数没有意义。当我尝试您的代码时,按钮因此被禁用。
  • 现在我编辑了 Viewmodel.cs ...但我仍然没有得到
  • 去掉 'CommandParameter="{x:Type views:myView}' 这个然后试试,
  • 好的,我删除了..但仍然没有得到预期的输出
  • Faisal 是对的,不需要CommandParameter,但我不认为这是行为的原因。我会尝试将命令属性设置为 public get 和 private set 并在构造函数或初始化方法中实例化它。

标签: c# wpf mvvm


【解决方案1】:

您不应从委托方法 (OpenFolder()) 调用命令。该命令除了在调用 Execute 时执行委托的方法之外没有其他任何作用,当您单击按钮时会自动完成。

另外ICommand.CanExecute() 通常由 WPF 本身自动调用,并根据结果仅启用,resp 禁用按钮。您很少在 ViewModel 中自己调用 CanExecute。在您的情况下,您希望该按钮始终启用,因此您可以跳过 CanExecute,或使用 p =&gt; true 表达式。

这应该可以工作

xaml:

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

视图模型:

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

【讨论】:

    【解决方案2】:

    进行以下更改,

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

    【讨论】:

    • 我对此进行了测试,它可以工作。您的代码中有错误。命令一次又一次地调用自己,
    • 没错,但调用仅在 ShowDialog() 之后进行,因此无论如何都应该首先打开对话窗口。他写的不是这样。
    • 我从视图中删除了 'CommandParameter="{x:Type views:myView}'。我相信他因此遇到了一些错误,
    • 不这么认为。这纯粹是一个typeof(myView),因此命令参数(对象)采用这个Type并且不应该导致错误,因为他在任何情况下都不使用它。
    • 是的...它对我有用,但如何使“选定的文件夹路径和文件夹名称”在浏览按钮 @Faisal Hafeez 旁边的文本框中可见
    【解决方案3】:

    我会这样写命令:

    public ICommand OpenFolderCommand { get; private set; }
    public MyViewModel() 
    {
        this.OpenFolderCommand = new RelayCommand(a=> this.OpenFolder(),p=> CanOpenFolder());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多