相关疑难解决方法(0)

使用MVVM处理WPF中的对话框

在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.

有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.

我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.

public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)

这没关系,但这意味着视图需要代码,这是我想远离的东西.

.net wpf design-patterns dialog mvvm

232
推荐指数
8
解决办法
11万
查看次数

从ViewModel关闭窗口

我使用a创建一个登录,window control以允许用户登录WPF我正在创建的应用程序.

到目前为止,我已经创建了一种方法,用于检查用户是否已输入正确的凭据,usernamepasswordtextbox登录屏幕上输入binding两个properties.

我通过创建一个bool方法来实现这一点,就像这样;

public bool CheckLogin()
{
    var user = context.Users.Where(i => i.Username == this.Username).SingleOrDefault();

    if (user == null)
    {
        MessageBox.Show("Unable to Login, incorrect credentials.");
        return false;
    }
    else if (this.Username == user.Username || this.Password.ToString() == user.Password)
    {
        MessageBox.Show("Welcome " + user.Username + ", you have successfully logged in.");

        return true;
    }
    else
    {
        MessageBox.Show("Unable to Login, incorrect credentials.");
        return false;
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm

81
推荐指数
8
解决办法
10万
查看次数

WPF MVVM:如何关闭窗口

点击后,我Button关闭了我的窗口:

<Button x:Name="buttonOk"  IsCancel="True">Ok</Button>
Run Code Online (Sandbox Code Playgroud)

这很好,直到我添加CommandButtonie

<Button x:Name="buttonOk" 
        Command="{Binding SaveCommand}" 
        IsCancel="True">Ok</Button>
Run Code Online (Sandbox Code Playgroud)

现在它不会因为我正在处理它而关闭Command.我可以通过EventHandler输入和调用this.Close()ie 来解决这个问题

<Button x:Name="buttonOk" 
        Click="closeWindow" 
        Command="{Binding SaveCommand}" 
        IsCancel="True">Ok</Button>
Run Code Online (Sandbox Code Playgroud)

但现在我的代码背后有代码,即方法SaveCommand.我使用的是MVVM模式,SaveCommand是我代码中唯一的代码.

我怎么能以不同的方式做到这一点,以免背后使用代码?

.net c# wpf xaml mvvm

67
推荐指数
7
解决办法
11万
查看次数

使用MVVM在WPF中创建新窗口的最佳方法

在邻居帖子中:ViewModel应如何关闭表单? 我发布了如何使用MVVM关闭Windows的愿景.现在我有一个问题:如何打开它们.

我有一个主窗口(主视图).如果用户单击"显示"按钮,则应显示"演示"窗口(模态对话框).使用MVVM模式创建和打开窗口的首选方法是什么?我看到两种一般方法:

第一个(可能是最简单的).事件处理程序"ShowButton_Click"应该在主窗口的代码中实现,方式如下:

        private void ModifyButton_Click(object sender, RoutedEventArgs e)
        {
            ShowWindow wnd = new ShowWindow(anyKindOfData);
            bool? res = wnd.ShowDialog();
            if (res != null && res.Value)
            {
                //  ... store changes if neecssary
            }
        }
Run Code Online (Sandbox Code Playgroud)
  1. 如果我们"显示"按钮状态应该被更改(启用/禁用),我们将需要添加将管理按钮状态的逻辑;
  2. 源代码非常类似于"旧式"WinForms和MFC源 - 我不确定这是好还是坏,请指教.
  3. 还有其他我错过的东西?

另一种方法:

在MainWindowViewModel中,我们将实现"ShowCommand"属性,该属性将返回命令的ICommand接口.Comman反过来:

  • 将举起"ShowDialogEvent";
  • 将管理按钮状态.

这种方法将更适合MVVM,但需要额外的编码:ViewModel类不能"显示对话框",因此MainWindowViewModel只会引发"ShowDialogEvent",MainWindowView我们需要在其MainWindow_Loaded方法中添加事件处理程序,这样的事情:

((MainWindowViewModel)DataContext).ShowDialogEvent += ShowDialog;
Run Code Online (Sandbox Code Playgroud)

(ShowDialog - 类似于'ModifyButton_Click'方法.)

所以我的问题是:1.你看到其他任何方法吗?你认为其中一个是好还是坏?(为什么?)

欢迎任何其他想法.

谢谢.

.net c# wpf mvvm

55
推荐指数
3
解决办法
5万
查看次数

WPF(MVVM):从Viewmodel关闭视图?

有人遇到过使用MVVM在视图模型中关闭视图的聪明方法吗?

也许有一种方法可以使用绑定来通知视图(窗口)关闭?

我真的很感激任何人的任何输入.

基本上我有一个绑定到loginViewModel的loginView,在viewmodel中(使用命令绑定)我测试登录是否成功,如果是,我基本上加载一个新的View(主视图)并附加其datacontext. ..

但我仍然显示loginView - 所以我需要发信号卸载..

我也希望有一个通用的解决方案,因为我确信在其他情况下我需要做这种事情

有任何想法吗?

wpf mvvm wpftoolkit

46
推荐指数
5
解决办法
5万
查看次数

使用MVVM实现"关闭窗口"命令

所以我的第一次尝试完成了后面的代码,现在我正在尝试重构我的代码以使用MVVM模式,遵循MVVM 在框信息中的指导.

我已经创建了一个viewmodel类来匹配我的视图类,并且我将代码从代码中移出到viewmodel中,从命令开始.

我的第一个障碍是尝试实现一个"关闭"按钮,如果数据未被修改则关闭窗口.我已经装配了一个CloseCommand来替换'onClick'方法,除了代码试图运行的地方外,一切都很好this.Close().显然,由于代码已从窗口移动到普通类,因此'this'不是窗口,因此不可关闭.但是,根据MVVM,viewmodel不知道视图,所以我无法调用view.Close().

有人可以建议我如何从viewmodel命令关闭窗口?

c# wpf mvvm relaycommand

40
推荐指数
6
解决办法
5万
查看次数

WPF Button.IsCancel属性如何工作?

"取消"按钮背后的基本思想是使用Escape Keypress关闭窗口.

您可以将"取消"按钮上的IsCancel属性设置为true,从而使"取消"按钮自动关闭对话框而不处理Click事件.

资料来源:编程WPF(格里菲斯,卖出)

所以这应该工作

<Window>
<Button Name="btnCancel" IsCancel="True">_Close</Button>
</Window>
Run Code Online (Sandbox Code Playgroud)

然而,我期望的行为并不适合我.父窗口是Application.StartupUri属性指定的主应用程序窗口.有效的是

<Button Name="btnCancel" IsCancel=True" Click="CloseWindow">_Close</Button>

private void CloseWindow(object sender, RoutedEventArgs) 
{
    this.Close();
}
Run Code Online (Sandbox Code Playgroud)
  • 根据窗口是普通窗口还是对话框,IsCancel的行为是否不同?只有在调用ShowDialog时,IsCancel才能像宣传的那样工作吗?
  • 按钮是否需要显式的Click处理程序(IsCancel设置为true)才能关闭Escape印刷机上的窗口?

wpf button

32
推荐指数
3
解决办法
3万
查看次数

在为表单关闭实现WPF MVVM模式时,获取"只能在创建Window并显示为对话框后才能设置DialogResult"

我正在尝试为WPF表单关闭实现 MVVM模式,这也在本博客中进行了解释,我收到System.InvalidOperationException,错误消息"只有在创建Window并显示为对话框后才能设置DialogResult".当我尝试在关闭按钮命令上设置对话框结果时:

DialogResult = true;
Run Code Online (Sandbox Code Playgroud)

这是我的ViewModel:

class MainWindowViewModel:INotifyPropertyChanged
{
    private bool? dialogResult;
    public bool? DialogResult
    {
        get { return dialogResult; }
        set
        {
            if (value != this.dialogResult)
            {
                this.dialogResult = value;
                OnPropertyChanged("DialogResult");
            }
        }
    }

    public string Text
    {
        get { return "Hello!"; }
    }

    void CloseCommandExecute()
    {
        this.DialogResult = true;
    } 
Run Code Online (Sandbox Code Playgroud)

这是XAML视图:

<Window x:Class="WpfApplication.Mvvm.Windowclosing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication.Mvvm.Windowclosing"
        local:DialogCloser.DialogResult="{Binding DialogResult}"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding Text}" …
Run Code Online (Sandbox Code Playgroud)

.net wpf

23
推荐指数
4
解决办法
1万
查看次数

WPF DialogResult声明性地?

在WinForms中,我们可以为按钮指定DialogResult.在WPF中,我们只能在XAML中声明取消按钮:

<Button Content="Cancel" IsCancel="True" />
Run Code Online (Sandbox Code Playgroud)

对于其他人,我们需要捕获ButtonClick并编写如下代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用MVVM,所以我只有Windows的XAML代码.但对于模态窗口我需要编写这样的代码,我不喜欢这样.在WPF中有更优雅的方式来做这些事情吗?

wpf modal-dialog

7
推荐指数
1
解决办法
2158
查看次数

如何使用MVVM Light Toolkit关闭带有取消按钮的ChildWindow

我是MVVM的新手,并试图找出如何使用MVVM Light Toolkit使用传统的Cancel按钮关闭ChildWindow.

在我的ChildWindow(StoreDetail.xaml)中,我有:

<Button x:Name="CancelButton" Content="Cancel" Command="{Binding CancelCommand}" />
Run Code Online (Sandbox Code Playgroud)

在我的ViewModel(ViewModelStoreDetail.cs)中,我有:

public ICommand CancelCommand { get; private set; }

public ViewModelStoreDetail()
{
    CancelCommand = new RelayCommand(CancelEval);
}

private void CancelEval()
{
    //Not sure if Messenger is the way to go here...
    //Messenger.Default.Send<string>("ClosePostEventChildWindow", "ClosePostEventChildWindow");
}
Run Code Online (Sandbox Code Playgroud)

silverlight mvvm childwindow icommand mvvm-light

7
推荐指数
1
解决办法
6179
查看次数