2

ViewModel に含まれるデータを使用してファイルを書き込むために、コード ビハインドで SaveFileDialog を使用したいと考えています。私が使用している XAML クラスは、親クラスのリスト ボックスで行われた選択によって設定されます。

    <Views:ChildView DataContext="{Binding Path=SelectedItem, ElementName=childrenListbox}"></Views:ChildView >

次に、ChildView XAML ファイル内で、期待どおりに ChildViewModel のプロパティ/メソッドに自由にアクセスできます。ただし、コードビハインドからそれらにアクセスする方法がわかりません。「ファイルを保存」ボタンがあります

    <Button Content="Save File" Click="Button_Click"></Button>

そのイベントはコード ビハインドで処理されます。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
        dlg.FileName = "Document";
        dlg.DefaultExt = ".txt";
        dlg.Filter = "Text documents (.txt)|*.txt";

        Nullable<bool> result = dlg.ShowDialog();

        if (result == true)
        {
            string filename = dlg.FileName;
            //Here I would like to call the SaveFile function in ChildViewModel
        }
    }

利用可能なすべてのプロパティを調べてみましたが、使用している ChildViewModel のインスタンスにアクセスする方法が見つかりません。この質問には簡単な解決策があるかもしれませんが、私は最初のギルドを作成していて、MVVM アプローチを使用しているため、コード ビハインドの使用に慣れていません。実用的な解決策を見つけるのに役立つ回答をいただければ幸いです。また、それを回避し、XAML のみを使用して SaveFileDialog を取得する方法がある場合は、MVVM でコード ビハインドを使用することについて私を批判してください (そうすれば、ModelView 内でファイルを簡単に保存できます)。

4

3 に答える 3

4

コードを表示していないため、ViewModel をどこに設定しているかわかりませんが、通常はDataContextルート要素のプロパティにあります。だから、そのようにキャストすることができます。

var viewModel = (ChildViewModel)this.DataContext;
于 2012-07-25T17:43:36.737 に答える
3

別のアプローチを試すことができます。

ボタンのコマンドを取得する

public abstract class MyCommandBase : ICommand
{
    public abstract bool CanExecute(object o);
    public abstract void Execute(object o);

    public MyViewModel ViewModel { get; set; }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}


public class ButtonClickCommand : MyCommandBase
{
    public ButtonClickCommand(MyViewModel vm)
    {
        base.ViewModel = vm;
    }

    public override bool CanExecute(object o)
    {
        return true;
    }

    public override void Execute(object o)
    {
        var context = this.ViewModel as MyViewModel;
        MessageBox.Show("Button was clicked for" + context.Id);
    }
}

ViewModel でそのコマンドのインスタンスを作成し、そのパブリック プロパティを作成します。

そして、あなたのXAMLではそれはただです

<Button Focusable="False" Command="{Binding CmdClickMyButton}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0">

そうすれば、ボタンをクリックすると、ViewModel に直接戻り、必要なすべての情報が得られます。データをファイルに保存することは問題ではありません。

于 2012-07-25T17:48:47.267 に答える
1

多分これが役立つかもしれません:

((YourViewModelClass)YourControl.DataContext).SaveFile();

よろしく

編集:

あなたの例によると:

((ChildViewModel)ChildView.DataContext).SaveFile();

ChildView のコード ビハインドでこのコードが必要な場合は、次のようになります。

((ChildViewModel)this.DataContext).SaveFile();

于 2012-07-25T17:42:35.603 に答える