标准的"模型视图控制器"模式与Microsoft的模型/视图/ ViewModel模式之间是否存在差异?
在Model-View-ViewModel体系结构WPF应用程序中实现ViewModel时,似乎有两个主要选择如何使其成为databindable.我已经看到了DependencyProperty
用于View将要绑定的属性的实现,我已经看到了实现的ViewModel INotifyPropertyChanged
.
我的问题是我应该何时优先选择其中一个?有任何性能差异吗?将ViewModel依赖项提供给WPF真的是个好主意吗?做出设计决定时还需要考虑什么?
我是一名C#/ Windows Forms程序员,拥有超过5年的经验.我一直在使用MVVM(Model-View-ViewModel)设计模式研究WPF.我在互联网上搜索了教程.我甚至看过杰森·多林格的全部精彩视频.虽然我找到了很多,但我没有找到一个从头到尾带我的人.我真正想要的是一个不承担任何以前的WPF知识的教程.
您最喜欢哪些WPF-MVVM教程可以帮助您学习?
我遇到了绑定到PasswordBox的问题.这似乎是一个安全风险,但我正在使用MVVM模式,所以我希望绕过这个.我在这里找到了一些有趣的代码(有没有人用过这个或类似的东西?)
http://www.wpftutorial.net/PasswordBox.html
它在技术上看起来很棒,但我不确定如何检索密码.
我基本上有我的LoginViewModel
for Username
和属性Password
.Username
很好,正在工作,因为它是一个TextBox
.
我按照说明使用了上面的代码并输入了这个
<PasswordBox ff:PasswordHelper.Attach="True"
ff:PasswordHelper.Password="{Binding Path=Password}" Width="130"/>
Run Code Online (Sandbox Code Playgroud)
当我有了PasswordBox
a TextBox
,Binding Path=Password
然后我的房产LoginViewModel
被更新了.
我的代码很简单,基本上我有一个Command
for my Button
.当我按下它时会CanLogin
被调用,如果它返回true,则调用它Login
.
你可以看到我检查我的房产在Username
这里工作得很好.
在Login
我一起发送到我的服务Username
和Password
,Username
包含数据从我View
却Password
是Null|Empty
private DelegateCommand loginCommand;
public string Username { get; set; }
public string Password { get; set; }
public ICommand LoginCommand
{
get
{ …
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习WPF和MVVM问题,但是遇到了障碍.这个问题与此问题相似但不完全相同(处理对话框-wpf-with-mvvm) ...
我有一个使用MVVM模式编写的"登录"表单.
此表单有一个ViewModel,它包含用户名和密码,这些用户名和密码使用普通数据绑定绑定到XAML中的视图.它还有一个"登录"命令,该命令绑定到表单上的"登录"按钮,使用正常数据绑定.
当"登录"命令触发时,它会调用ViewModel中的一个函数,该函数将关闭并通过网络发送数据以进行登录.当此函数完成时,有2个操作:
登录无效 - 我们只显示一个MessageBox,一切都很好
登录有效,我们需要关闭登录表单并让它返回true作为其DialogResult
...
问题是,ViewModel对实际视图一无所知,那么如何关闭视图并告诉它返回一个特定的DialogResult?我可以在CodeBehind中粘贴一些代码,和/或将View传递给ViewModel,但这似乎完全打败了MVVM的全部内容......
最后,我刚刚违反了MVVM模式的"纯度",并让View发布了一个Closed
事件,并公开了一个Close
方法.ViewModel然后才会调用view.Close
.该视图仅通过接口已知并通过IOC容器连接,因此不会丢失可测试性或可维护性.
接受的答案是-5票,这似乎很愚蠢!虽然我很清楚通过在"纯粹"时解决问题所获得的良好感受,当然我不是唯一一个认为200行事件,命令和行为只是为了避免单行方法"模式"和"纯度"的名称有点荒谬......
在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.
有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.
我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.
public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)
这没关系,但这意味着视图需要代码,这是我想远离的东西.
如何检索在WPF树视图中选择的项目?我想在XAML中这样做,因为我想绑定它.
你可能会认为它SelectedItem
显然是不存在的只是readonly因此无法使用.
这就是我想要做的:
<TreeView ItemsSource="{Binding Path=Model.Clusters}"
ItemTemplate="{StaticResource ClusterTemplate}"
SelectedItem="{Binding Path=Model.SelectedCluster}" />
Run Code Online (Sandbox Code Playgroud)
我想绑定SelectedItem
到我的模型上的属性.
但这给了我错误:
'SelectedItem'属性是只读的,不能通过标记设置.
编辑: 好的,这是我解决这个问题的方式:
<TreeView
ItemsSource="{Binding Path=Model.Clusters}"
ItemTemplate="{StaticResource HoofdCLusterTemplate}"
SelectedItemChanged="TreeView_OnSelectedItemChanged" />
Run Code Online (Sandbox Code Playgroud)
在我的xaml的codebehindfile中:
private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
Model.SelectedCluster = (Cluster)e.NewValue;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用MVVM模型开发一个应用程序,但我已经达到了需要选择使用哪个框架的程度.
可能的选择包括:
根据您的经验,哪个更好?
我认为我的应用程序现在变得非常大,太大而无法使用单个ViewModel处理每个View.
所以我想知道创建多个ViewModel并将它们全部加载到一个View中会有多困难.需要注意的是,我还需要能够将X ViewModel数据传递到Y ViewModel数据中,以便各个ViewModel需要能够相互通信或至少相互了解.
例如,我有一个<select>
下拉列表,选择下拉列表具有一个选定的状态,允许我在<select>
另一个ViewModel 中将所选项目的ID传递给另一个Ajax调用....
在单个视图中处理众多ViewModel的任何要点赞赏:)
我正在尝试构建一个指令,负责向声明它的元素添加更多指令.例如,我想构建一个负责添加的指令datepicker
,datepicker-language
和ng-required="true"
.
如果我尝试添加这些属性然后使用$compile
我显然会生成一个无限循环,所以我正在检查我是否已经添加了所需的属性:
angular.module('app')
.directive('superDirective', function ($compile, $injector) {
return {
restrict: 'A',
replace: true,
link: function compile(scope, element, attrs) {
if (element.attr('datepicker')) { // check
return;
}
element.attr('datepicker', 'someValue');
element.attr('datepicker-language', 'en');
// some more
$compile(element)(scope);
}
};
});
Run Code Online (Sandbox Code Playgroud)
当然,如果我没有$compile
元素,那么将设置属性但是指令不会被引导.
这种方法是正确的还是我做错了?有没有更好的方法来实现相同的行为?
UDPATE:鉴于这$compile
是实现这一目标的唯一方法,有没有办法跳过第一个编译传递(该元素可能包含几个子节点)?也许通过设置terminal:true
?
更新2:我已经尝试将指令放入一个select
元素中,正如预期的那样,编译运行两次,这意味着预期option
的数量是预期的两倍.
javascript model-view-controller mvvm angularjs angularjs-directive
mvvm ×10
wpf ×7
c# ×4
.net ×2
data-binding ×2
angularjs ×1
architecture ×1
dialog ×1
frameworks ×1
javascript ×1
knockout.js ×1
passwords ×1
selecteditem ×1
treeview ×1
wpf-controls ×1