WPF从UserControl MVVM关闭窗口

时间:2020-05-18 22:08:09

标签: wpf xaml mvvm binding datacontext

我目前的Binding有问题,因为按Button后,它应该关闭某个Window,但没有。这是对情况的更详细描述:

在我的应用程序中,我具有以下按钮:

enter image description here

按下后,将启动新的Window。它包含一个UserControl,并用作DialogBox来确认用户要保存所有更改。这是启动DialogBox (Window)的代码。请注意,该窗口是通过引用传递的:

private void OpenRegisterDialog(string changes)
    {
        window = new Window
        {
            Title = "Confirmation",
            ResizeMode = ResizeMode.NoResize,
            WindowStartupLocation = WindowStartupLocation.CenterScreen
        };

        SaveConfirmationDg = new SaveConfirmationDialog(ref window);
        window.ShowDialog();
    }

请注意,Content中的Window尚未设置,我将在此进行记录。

DialogBox的外观如下(按 OUI NON 时,窗口应该关闭,但不是):

enter image description here

这是用于生成DialogBox的xaml,UserControl嵌套在我们的DialogBox Window中。

SaveConfirmation.xaml

<Grid HorizontalAlignment="Center" VerticalAlignment="Center" Height="200" Width="350" Background="Black">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Grid Grid.Row="0">
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" Text="Voulez-vous enregistrer les modifications?" />
    </Grid>

    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid Grid.Column="0">
            <Button Foreground="White" Content="OUI" Command="{Binding Close}" CommandParameter="close" Margin="10,0" />
        </Grid>

        <Grid Grid.Column="1">
            <Button Foreground="White" Content="NON" Command="{Binding Close}" CommandParameter="close" Margin="10,0" />
        </Grid>
        
    </Grid>

在使用MVVM模式时,我将DataContext中的Code-Behind设置为 SaveConfirmationDialogViewModel.cs (请注意,创建的窗口将作为参考传递)

public SaveConfirmationDialog(ref Window window)
    {
        InitializeComponent();
        DataContext = new SaveConfirmationDialogViewModel(ref window);
    }

最后,这是我创建和分配Content中的DialogBox的方法:

SaveConfirmationDialogViewModel.Cs

 class SaveConfirmationDialogViewModel : ViewModelBase
{

    public Window CurrentWindow;
    public MyICommand<string> Close { get; private set; }

    SaveConfirmationDialog SaveConfDg;

    public SaveConfirmationDialogViewModel(ref Window window)
    {
        SaveConfDg = new SaveConfirmationDialog();
        window.Content = SaveConfDg;
        window.SizeToContent = SizeToContent.WidthAndHeight;
        CurrentWindow = window;
        Close = new MyICommand<string>(ExitDialog);
    }

    private void ExitDialog(string exit)
    {
        CurrentWindow.Close();
    }
}

请注意,CurrentWindow被分配了一个window的引用,以便可以在Constructor之外使用它。按下 OUI NON 按钮后,应使用ExitDialog的{​​{1}}方法关闭Close command,但我发现甚至没有打电话,因为我已经通过设置断点进行了检查。

我认为问题可能出在DataContext上。有谁知道问题可能在哪里 是吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

最后,问题非常简单,我只需要注释掉Constructor的第一行并从SaveConfirmationDialog传递Code-Behind对象

SaveConfirmationDialogViewModel.cs

public SaveConfirmationDialogViewModel(ref Window window, SaveConfirmationDialog SaveConfDg)
    {
        //SaveConfDg = new SaveConfirmationDialog();
        window.Content = SaveConfDg;
        window.SizeToContent = SizeToContent.WidthAndHeight;
        CurrentWindow = window;
        Close = new MyICommand<string>(ExitDialog);
    }

SaveConfirmationDialog.xaml.cs

public SaveConfirmationDialog(ref Window window)
    {
        InitializeComponent();

        //Added this as second parameter
        DataContext = new SaveConfirmationDialogViewModel(ref window, this);
    }