de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 GJPD
GJPD
質問

MVVMを使ったWPF FolderBrowserDialog(背後のコードなし)

説明 ブラウズボタンをクリックすると、FolderBrowserDialog Boxが表示されます。そして、FolderBrowserDialog Boxでは、任意のフォルダを選択してokをクリックすると、フォルダ名と一緒にその特定のfolderpathは、ブラウズボタンの横にあるテキストボックスに表示されるべきである...しかし、私はしなかった&#39をクリックすると何も得ることができません。 私のコードをチェックし、修正してください。

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;
        }
    }
-1 2019-01-08T09:33:05+00:00 3
 fhnaseer
fhnaseer
編集された質問 8日 1月 2019 в 10:40
プログラミング
wpf
c#
mvvm
 c0d3b34n
c0d3b34n
8日 1月 2019 в 10:10
2019-01-08T10:10:27+00:00
さらに
ソース
編集
#38407662

私なら、このようにコマンドを書きます。

public ICommand OpenFolderCommand { get; private set; }
public MyViewModel() 
{
    this.OpenFolderCommand = new RelayCommand(a=> this.OpenFolder(),p=> CanOpenFolder());
}
0
0
解決策・回答
 fhnaseer
fhnaseer
8日 1月 2019 в 10:13
2019-01-08T10:13:03+00:00
さらに
ソース
編集
#38407663

以下の変更を行ってください。

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
0
 Liero
Liero
8日 1月 2019 в 10:13
2019-01-08T10:13:34+00:00
さらに
ソース
編集
#38407664

デリゲートメソッド(OpenFolder())からコマンドを呼び出してはいけません。このコマンドは、ボタンをクリックしたときに自動的に実行される Execute が呼ばれたときにデリゲートメソッドを実行すること以外には何も行いません。

また、ICommand.CanExecute()は、通常、WPF自身が自動的に呼び出し、その結果に基づいてボタンを有効にしたり、無効にしたりするだけです。ViewModelの中で、自分でCanExecuteを呼び出すことはほとんどないでしょう。あなたの場合、ボタンを常に有効にしたいので、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;
   }
}
 Liero
Liero
編集した答え 8日 1月 2019 в 10:19
0
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Денис Анненский
登録済み 2日前
2
365
登録済み 6日前
3
True Image
登録済み 6日前
4
archana agarwal
登録済み 1週間前
5
Maxim Zhilyaev
登録済み 1週間前
JA
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属