在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.
有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.
我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.
public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)
这没关系,但这意味着视图需要代码,这是我想远离的东西.
我使用a创建一个登录,window control以允许用户登录WPF我正在创建的应用程序.
到目前为止,我已经创建了一种方法,用于检查用户是否已输入正确的凭据,username并password在textbox登录屏幕上输入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) 点击后,我Button关闭了我的窗口:
<Button x:Name="buttonOk" IsCancel="True">Ok</Button>
Run Code Online (Sandbox Code Playgroud)
这很好,直到我添加Command到Buttonie
<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是我代码中唯一的代码.
我怎么能以不同的方式做到这一点,以免背后使用代码?
在邻居帖子中: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)
另一种方法:
在MainWindowViewModel中,我们将实现"ShowCommand"属性,该属性将返回命令的ICommand接口.Comman反过来:
这种方法将更适合MVVM,但需要额外的编码:ViewModel类不能"显示对话框",因此MainWindowViewModel只会引发"ShowDialogEvent",MainWindowView我们需要在其MainWindow_Loaded方法中添加事件处理程序,这样的事情:
((MainWindowViewModel)DataContext).ShowDialogEvent += ShowDialog;
Run Code Online (Sandbox Code Playgroud)
(ShowDialog - 类似于'ModifyButton_Click'方法.)
所以我的问题是:1.你看到其他任何方法吗?你认为其中一个是好还是坏?(为什么?)
欢迎任何其他想法.
谢谢.
有人遇到过使用MVVM在视图模型中关闭视图的聪明方法吗?
也许有一种方法可以使用绑定来通知视图(窗口)关闭?
我真的很感激任何人的任何输入.
基本上我有一个绑定到loginViewModel的loginView,在viewmodel中(使用命令绑定)我测试登录是否成功,如果是,我基本上加载一个新的View(主视图)并附加其datacontext. ..
但我仍然显示loginView - 所以我需要发信号卸载..
我也希望有一个通用的解决方案,因为我确信在其他情况下我需要做这种事情
有任何想法吗?
所以我的第一次尝试完成了后面的代码,现在我正在尝试重构我的代码以使用MVVM模式,遵循MVVM 在框信息中的指导.
我已经创建了一个viewmodel类来匹配我的视图类,并且我将代码从代码中移出到viewmodel中,从命令开始.
我的第一个障碍是尝试实现一个"关闭"按钮,如果数据未被修改则关闭窗口.我已经装配了一个CloseCommand来替换'onClick'方法,除了代码试图运行的地方外,一切都很好this.Close().显然,由于代码已从窗口移动到普通类,因此'this'不是窗口,因此不可关闭.但是,根据MVVM,viewmodel不知道视图,所以我无法调用view.Close().
有人可以建议我如何从viewmodel命令关闭窗口?
"取消"按钮背后的基本思想是使用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)
我正在尝试为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) 在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中有更优雅的方式来做这些事情吗?
我是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) wpf ×9
mvvm ×7
.net ×4
c# ×4
button ×1
childwindow ×1
dialog ×1
icommand ×1
modal-dialog ×1
mvvm-light ×1
relaycommand ×1
silverlight ×1
wpftoolkit ×1
xaml ×1