2

我想在后面的代码中使用 SaveFileDialog 来使用 ViewModel 中包含的数据编写文件。我正在使用的 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 回答