标签: mvvm

AndroidViewModel与ViewModel

随着Android架构组件库的引入,引入了几个新类,包括AndroidViewModelViewModel.但是,我无法弄清楚这两个类之间的区别.该文件,简要地描述AndroidViewModel如下:

应用上下文感知 ViewModel

我很欣赏这种简洁,但究竟是什么意思呢?我们什么时候应该选择使用AndroidViewModel,ViewModel反之亦然?

android mvvm android-architecture-components

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

从视图模型(C#)设置焦点在WPF中的文本框

在我看来,我有一个TextBox和一个Button.

现在我在点击按钮时检查条件,如果条件结果为假,向用户显示消息,然后我必须将光标设置为TextBox控件.

if (companyref == null)
{
    var cs = new Lipper.Nelson.AdminClient.Main.Views.ContactPanels.CompanyAssociation(); 

    MessageBox.Show("Company does not exist.", "Error", MessageBoxButton.OK,
                    MessageBoxImage.Exclamation);

    cs.txtCompanyID.Focusable = true;

    System.Windows.Input.Keyboard.Focus(cs.txtCompanyID);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在ViewModel中.

CompanyAssociation是视图名称.

但光标没有设置在TextBox.

xaml是:

<igEditors:XamTextEditor Name="txtCompanyID" 
                         KeyDown="xamTextEditorAllowOnlyNumeric_KeyDown"
                         ValueChanged="txtCompanyID_ValueChanged"
                         Text="{Binding Company.CompanyId,
                                        Mode=TwoWay,
                                        UpdateSourceTrigger=PropertyChanged}"
                         Width="{Binding ActualWidth, ElementName=border}"
                         Grid.Column="1" Grid.Row="0"
                         VerticalAlignment="Top"
                         HorizontalAlignment="Stretch"
                         Margin="0,5,0,0"
                         IsEnabled="{Binding Path=IsEditable}"/>

<Button Template="{StaticResource buttonTemp1}"
        Command="{Binding ContactCommand}"
        CommandParameter="searchCompany"
        Content="Search"
        Width="80"
        Grid.Row="0" Grid.Column="2"
        VerticalAlignment="Top"
        Margin="0"
        HorizontalAlignment="Left"
        IsEnabled="{Binding Path=IsEditable}"/>
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml textbox mvvm

124
推荐指数
6
解决办法
11万
查看次数

将只读GUI属性推送回ViewModel

我想编写一个ViewModel,它始终知道View中某些只读依赖项属性的当前状态.

具体来说,我的GUI包含一个FlowDocumentPageViewer,它一次从FlowDocument显示一个页面.FlowDocumentPageViewer公开了两个名为CanGoToPreviousPage和CanGoToNextPage的只读依赖项属性.我希望我的ViewModel始终知道这两个View属性的值.

我想我可以使用OneWayToSource数据绑定来做到这一点:

<FlowDocumentPageViewer
    CanGoToNextPage="{Binding NextPageAvailable, Mode=OneWayToSource}" ...>
Run Code Online (Sandbox Code Playgroud)

如果这是允许的,那将是完美的:每当FlowDocumentPageViewer的CanGoToNextPage属性发生更改时,新值将被推送到ViewModel的NextPageAvailable属性,这正是我想要的.

不幸的是,这不编译:我收到一个错误,说'CanGoToPreviousPage'属性是只读的,不能从标记设置.显然只读属性不支持任何类型的数据绑定,甚至不支持与该属性相关的只读数据绑定.

我可以让我的ViewModel的属性为DependencyProperties,并使OneWay绑定以另一种方式运行,但我并不为关注点分离违规而疯狂(ViewModel需要对View的引用,MVVM数据绑定应该避免).

FlowDocumentPageViewer不公开CanGoToNextPageChanged事件,我不知道从DependencyProperty获取更改通知的任何好方法,没有创建另一个DependencyProperty来绑定它,这在这里看起来有点过分.

如何让ViewModel了解视图的只读属性的更改?

data-binding wpf readonly mvvm

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

AngularJS浏览器通过使用指令自动填充解决方法

在AngularJS中提交表单并使用浏览器记住密码功能时,在后续登录尝试中,您让浏览器使用用户名和密码填写登录表单,$scope不会根据自动填充更改模型.

我发现的唯一脏黑客是使用以下指令:

app.directive("xsInputSync", ["$timeout" , function($timeout) {
    return {
        restrict : "A",
        require: "?ngModel",
        link : function(scope, element, attrs, ngModel) {
            $timeout(function() {
                if (ngModel.$viewValue && ngModel.$viewValue !== element.val()) {
                    scope.apply(function() {
                        ngModel.$setViewValue(element.val());
                    });
                }
                console.log(scope);
                console.log(ngModel.$name);
                console.log(scope[ngModel.$name]);
            }, 3000);
        }
    };
}]);
Run Code Online (Sandbox Code Playgroud)

问题是ngModel.$setViewValue(element.val());不会根据element.val()返回的值更改模型和视图.我怎么能做到这一点?

javascript mvvm angularjs

110
推荐指数
6
解决办法
8万
查看次数

什么是ViewModelLocator,与DataTemplates相比有哪些优缺点?

有人可以快速总结一下ViewModelLocator是什么,它是如何工作的,以及与DataTemplates相比使用它的优缺点是什么?

我曾尝试在Google上查找信息,但似乎有许多不同的实现,并没有关于它是什么以及使用它的优点/缺点的严格列表.

wpf datatemplate mvvm mvvm-light viewmodellocator

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

WPF中的MVVM - 如何提醒ViewModel模型中的更改...还是应该?

我正在阅读一些MVVM文章,主要是这个这个.

我的具体问题是:如何将模型更改从模型传递到ViewModel?

在Josh的文章中,我没有看到他这样做.ViewModel始终向Model询问属性.在Rachel的例子中,她确实拥有模型实现INotifyPropertyChanged,并从模型中引发事件,但它们是供视图本身使用的(有关她为什么这样做的详细信息,请参阅她的文章/代码).

我在任何地方都看不到模型警告ViewModel模型属性更改的示例.这让我担心,也许是因为某些原因没有做到的. 是否有一种模式用于警告ViewModel模型中的更改? 这似乎是必要的,因为(1)可以想象每个模型有超过1个ViewModel,(2)即使只有一个ViewModel,模型上的某些操作可能会导致其他属性被更改.

我怀疑可能会有"你为什么要这样做?"的答案/评论.评论,所以这里是我的程序的描述.我是MVVM的新手,所以也许我的整个设计都有问题.我将简要介绍一下.

我编写的东西比"客户"或"产品"类更有趣(至少对我而言!).我在编程BlackJack.

我有一个View,后面没有任何代码,只依赖于绑定到ViewModel中的属性和命令(参见Josh Smith的文章).

是好还是坏,我把该模型应该不仅包含类,如态度PlayingCard,Deck但也BlackJackGame认为保持整场比赛的状态,并且知道当玩家已经破产,经销商必须抓牌,阶级和玩家和经销商当前得分是多少(少于21,21,胸围等).

BlackJackGame我公开像"DrawCard"这样的方法,我发现在绘制卡片时CardScore,IsBust应该更新属性,例如和,并将这些新值传递给ViewModel.也许这是错误的思考?

人们可以采取ViewModel称之为DrawCard()方法的态度,因此他应该知道要求更新的分数并找出他是否破产.意见?

在我的ViewModel中,我有逻辑来获取扑克牌的实际图像(基于套装,等级)并使其可用于视图.该模型不应该与此有关(也许其他ViewModel只使用数字而不是扑克牌图像).当然,也许有些人会告诉我模型甚至不应该有BlackJack游戏的概念,而应该在ViewModel中处理?

.net c# wpf mvvm

105
推荐指数
4
解决办法
9万
查看次数

使用MVVM从WPF ListView项目中触发双击事件

在使用MVVM的WPF应用程序中,我有一个带有listview项的usercontrol.在运行时,它将使用数据绑定来用列表视图填充对象集合.

将双击事件附加到列表视图中的项目的正确方法是什么,以便在列表视图中的项目被双击时,视图模型中的相应事件被触发并且引用了单击的项目?

如何以干净的MVVM方式完成,即视图中没有代码?

wpf mvvm

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

WPF OpenFileDialog与MVVM模式?

我刚开始学习WPF的MVVM模式.我碰壁了:当你需要展示一个OpenFileDialog时你会怎么做

这是我尝试使用它的示例UI:

替代文字

单击"浏览"按钮时,应显示OpenFileDialog.当用户从OpenFileDialog中选择文件时,文件路径应显示在文本框中.

我怎么能用MVVM做到这一点?

更新:如何使用MVVM实现此功能并使其可以进行单元测试?以下解决方案不适用于单元测试.

wpf openfiledialog mvvm

95
推荐指数
2
解决办法
6万
查看次数

MVVM毫无意义吗?

正统的MVVM实现是没有意义的吗?我正在创建一个新的应用程序,我考虑了Windows窗体和WPF.我之所以选择WPF,是因为它具有前瞻性,并提供了很大的灵活性.使用XAML的代码更少,更容易对UI进行重大更改.

由于WPF的选择是显而易见的,我认为我可以使用MVVM作为我的应用程序架构,因为它提供了可混合性,分离问题和单元可测试性.从理论上讲,它看起来很像UI编程的圣杯.这个简短的冒险; 然而,已经变成了一个真正的头痛.正如在实践中所预期的那样,我发现我已将一个问题换成了另一个问题.我倾向于成为一个强迫性的程序员,因为我想以正确的方式做事,这样我才能获得正确的结果,并可能成为更好的程序员.MVVM模式刚刚落后于我对生产力的考验,刚刚变成了一个令人讨厌的大黑客!

明显的例子是添加对模态对话框的支持.正确的方法是建立一个对话框并将其绑定到视图模型.让这个工作很难.为了从MVVM模式中受益,您必须在应用程序的各个层中的多个位置分发代码.您还必须使用深奥的编程结构,如模板和lamba表达式.让你盯着屏幕挠挠头的东西.正如我最近发现的那样,这使得维护和调试成为一场噩梦.我有一个关于盒子正常工作,直到我第二次调用它时出现异常,说它一旦关闭就无法再显示对话框.我必须为对话框窗口添加一个关闭功能的事件处理程序,在IDialogView实现中添加另一个,最后在IDialogViewModel中添加另一个.我以为MVVM会让我们免于这种奢侈的hackery!

有几个人为这个问题提供竞争解决方案,他们都是黑客,并没有提供一个干净,易于重复使用的优雅解决方案.大多数MVVM工具包都会掩盖对话框,当它们确实解决它们时,它们只是不需要自定义接口或视图模型的警报框.

我打算放弃MVVM视图模式,至少是它的正统实现.你怎么看?如果你有任何问题,是否值得为你带来麻烦?我只是一个不称职的程序员,还是MVVM不是它被炒作的东西?

.net wpf mvvm

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

如何在WPF/MVVM应用程序中处理依赖项注入

我正在启动一个新的桌面应用程序,我想使用MVVM和WPF构建它.

我也打算使用TDD.

问题是我不知道如何使用IoC容器将依赖项注入我的生产代码.

假设我有以下类和接口:

public interface IStorage
{
    bool SaveFile(string content);
}

public class Storage : IStorage
{
    public bool SaveFile(string content){
        // Saves the file using StreamWriter
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个IStorage作为依赖项的类,假设这个类是一个ViewModel或一个业务类......

public class SomeViewModel
{
    private IStorage _storage;

    public SomeViewModel(IStorage storage){
        _storage = storage;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以轻松编写单元测试,以确保它们正常工作,使用模拟等.

问题是在实际应用中使用它.我知道我必须有一个链接IStorage接口默认实现的IoC容器,但我该怎么做呢?

例如,如果我有以下xaml会怎么样:

<Window 
    ... xmlns definitions ...
>
   <Window.DataContext>
        <local:SomeViewModel />
   </Window.DataContext>
</Window>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何正确地"告诉"WPF注入依赖项?

另外,假设我需要一个SomeViewModel来自我的cs代码的实例,我应该怎么做?

我觉得我完全迷失了,我会感谢任何有关如何处理它的最好方法的例子或指导.

我熟悉StructureMap,但我不是专家.此外,如果有更好/更容易/开箱即用的框架,请告诉我.

提前致谢.

c# wpf dependencies dependency-injection mvvm

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