1

我有一个视图,它在 Windows 资源中初始化一个视图模型。此外,我给我的网格 DataContext。

我的问题是,如何将命令添加到我的 Windows 关闭事件中,将 mvvm 保存在内存中?我尝试了这篇文章的版本: 使用 WPF / MVVM Light Toolkit 处理窗口关闭事件 ......但它不能使用事件触发器工作,因为我无法从网格外部访问视图模型,所以我不能访问我的命令。

我的问题有什么解决方案吗?

问候

扬尼克

编辑:这是我的 xaml:

<Window x:Class="WpfApplication1.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewModels="clr-namespace:WpfApplication1.ViewModels"
    xmlns:converter="clr-namespace:WpfApplication1.Converter"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <viewModels:MainWindowViewModel x:Key="ViewModel"/>
    </Window.Resources>

    <Grid DataContext="{StaticResource ViewModel}">...</Grid>
</Window>
4

2 回答 2

1

您可以通过这种方式引用静态资源的成员:

Command="{Binding Path=CloseCommand, Source={StaticResource ViewModel}}"

这是完整的测试项目。我使用带有绑定的文本框来确保保存数据。

<Window x:Class="WpfApplication1.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewModels="clr-namespace:WpfApplication1.ViewModels"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <viewModels:MainWindowViewModel x:Key="ViewModel"/>
    </Window.Resources>

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding Path=CloseCommand, Source={StaticResource ViewModel}}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid DataContext="{StaticResource ViewModel}">
        <TextBox Text="{Binding Txt, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>

在 ViewModel 代码中,我使用静态引用来存储数据 ( LastInstance)。你可以用你自己的方法替换它。

我还使用Command了它的自定义实现ICommand。如果你愿意,我可以在这里添加完整的实现。

    public MainWindowViewModel()
    {
        //save or load here...
        if (LastInstance != null) Txt = LastInstance.Txt;
        CloseCommand = new Command(o => LastInstance = this);
        //...
    }

    public static ViewModel LastInstance;

    //Txt Dependency Property
    public string Txt
    {
        get { return (string)GetValue(TxtProperty); }
        set { SetValue(TxtProperty, value); }
    }
    public static readonly DependencyProperty TxtProperty =
        DependencyProperty.Register("Txt", typeof(string), typeof(ViewModel), new UIPropertyMetadata(null));
    //CloseCommand Dependency Property
    public Command CloseCommand
    {
        get { return (Command)GetValue(CloseCommandProperty); }
        set { SetValue(CloseCommandProperty, value); }
    }
    public static readonly DependencyProperty CloseCommandProperty =
        DependencyProperty.Register("CloseCommand", typeof(Command), typeof(ViewModel), new UIPropertyMetadata(null));
于 2013-11-06T12:51:25.950 回答
0

解决此问题的典型方法是拥有一个 MainViewModel 并将您的 Window 的 DataContext 设置为它。然后在 MainViewModel 中定义其他的 viewModel。

<Window>
    <Grid DataContext="{Binding MyGridViewModel}">
    </Grid>
    <DockPanel DataContext="{Binding AnotherViewModel}">
    </DockPanel>
</Window>

在 MainWindow 构造函数中:

this.DataContext = new MainViewModel();

在 MainViewModel 构造函数中:

this.MyGridViewModel = new OtherViewModel();

这样,您有很多选项可以通过 viewModel 引用找到所需的对象。

于 2013-11-06T11:18:43.377 回答