标签: viewmodel

WPF MVVM:ViewModels如何相互通信?

我有一个View,它有2个子视图,ViewModel分配给每个视图:

ViewA - ViewModelA
{ 
   ViewB - ViewModelB
   ViewC - ViewModelC
}
Run Code Online (Sandbox Code Playgroud)

ViewB有一个文本框,ViewC有一个组合框,我需要从ViewModelA访问这两个组合框.不是GUI控件本身,而是绑定值,即文本框的.Text和ComboBox的.SelectedItem.目前我只将ViewModelB和ViewModelC作为ViewModelA的属性,但感觉不对.

视图模型在不破坏MVVM模式的情况下相互通信的标准方法是什么?

wpf mvvm viewmodel

19
推荐指数
1
解决办法
6915
查看次数

MVC ViewModels和Entity Framework查询

我是MVC和实体框架的新手,我有一个关于正确/首选方式的问题.

我一直在关注Nerd Dinner MVC应用程序,因为我正在编写这个应用程序.我有一个页面,其中包含来自几个不同地方的数据.它显示来自几个不同表的详细信息,并且还具有查找表中的下拉列表.

我创建了一个包含所有这些信息的ViewModel类:

class DetailsViewModel {
    public List<Foo> DropdownListData { get; set; }

    // comes from table 1
    public string Property1 { get; set; } 
    public string Property2 { get; set; }

    public Bar SomeBarObject { get; set; } // comes from table 2
}
Run Code Online (Sandbox Code Playgroud)

在Nerd Dinner代码中,他们的例子有点过于简单化了.DinnerFormViewModel采用单个实体:Dinner.根据晚餐,它根据晚餐地点为各国创建一个SelectList.

由于简单,它们的数据访问代码也非常简单.他有一个简单的DinnerRepository,其方法名为GetDinner().在他的行动方法中,他可以做一些简单的事情:

Dinner dinner = new Dinner();

// return the view model
return View(new DinnerFormViewModel(dinner));
Run Code Online (Sandbox Code Playgroud)

要么

Dinner dinner = repository.GetDinner(id);

return View(new DinnerFormViewModel(dinner));
Run Code Online (Sandbox Code Playgroud)

我的查询比这复杂得多,从多个表中提取...创建一个匿名类型:

var query = from a in ctx.Table1
            where …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework repository-pattern viewmodel

19
推荐指数
2
解决办法
1万
查看次数

WPF事件绑定到ViewModel(对于非Command类)

我正在使用应用程序的第二个版本,作为重写的一部分,我必须转向MVVM架构.我正面临压力,要在视图模型类中放置绝对的所有代码 - 在代码隐藏文件中使用c#是不受欢迎的.(我知道,我知道......我知道背后的代码不是坏事,但这次不是我的电话).

对于实现命令界面的对象,这很容易.我已经能够找到大量关于如何将这些对象的Command绑定到视图模型中的ICommand的信息.问题是没有这种接口的对象,例如

<ListBox
   x:Name="myListBox"
   MouseDoubleClick="myCallbackFunction">

<!-- ... -->

</ListBox>
Run Code Online (Sandbox Code Playgroud)

我想知道如何将Listbox的MouseDoubleClick事件绑定到myCallbackFunction,这是在视图模型中实现的.这甚至可能吗?

谢谢!

c# xaml binding mvvm viewmodel

19
推荐指数
2
解决办法
4万
查看次数

当前的MVVM视图模型是否违反了单一责任原则?

使用当前的实践(至少使用WPF和Silverlight),我们在视图模型中看到通过命令绑定绑定的视图,或者我们至少看到视图模型中处理的视图事件.这似乎违反了SRP,因为视图模型不仅模拟视图状态,而且响应视图(用户).其他人已经询问如何构建视图模型而不违反SRP或询问他们的实现是否这样做(最后是MVC中的控制器,但大致类似).

那么目前的做法是否违反了SRP?或者"视图模型"真的是一组不违反SRP的东西?为了解决这个问题,似乎我们需要知道什么是单一责任,或者如果概念中有多个责任,个别职责是否分开,符合SRP.我不确定.

维基百科对视图模型的定义

[View] ViewModel是一个"视图模型",意思是它是View的抽象,也用于视图和模型之间的数据绑定

对于SRP而言,这似乎已经足够了,但后来这篇文章说明了(我强调了)

[ViewModel]充当数据绑定器/转换器,将模型信息更改为View信息,并将命令从View传递到模型

一篇关于视图模型角色的Prism博客文章中,作者说(再次,我的重点)

它归结为视图模型是以下的组合:

  • 视图的抽象
  • 命令
  • 价值转换器
  • 查看状态

我确定我错过了许多定义,但它们似乎属于以下类别:

  1. 建模视图状态的单一"模糊"责任(所以我们的意思是什么 状态)
  2. 多重职责(查看状态,用户交互(即命令))
  3. 由单一特定职责(抽象,状态,交互,转换)组成的综合,因此具有单一责任:"管理所有这些东西".

如果你很好奇,我"关心"这个因为(2)感觉正确,但似乎与普遍的实施相反.

silverlight wpf single-responsibility-principle mvvm viewmodel

19
推荐指数
3
解决办法
2490
查看次数

Kotlin中的ViewModel:未解决的参考

我试图在100%Kotlin应用程序中实现ViewModel.我能找到的每一篇文档都说我想用它来获取ViewModel实例:

ViewModelProviders.of(this).get(CustomViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

根据文档,我应该能够导入:

import android.arch.lifecycle.ViewModelProviders
Run Code Online (Sandbox Code Playgroud)

但是这个导入尚未解决.我在我的构建文件中使用以下内容:

def androidArchVersion = '1.1.1'
implementation "android.arch.lifecycle:viewmodel:$androidArchVersion"
implementation "android.arch.lifecycle:livedata:$androidArchVersion"
annotationProcessor "android.arch.lifecycler:compiler:$androidArchVersion"
testImplementation "android.arch.core:core-testing:$androidArchVersion"
Run Code Online (Sandbox Code Playgroud)

为什么我不能访问ViewModelProviders

android viewmodel gradle kotlin android-architecture-components

19
推荐指数
3
解决办法
7211
查看次数

在WPF中使用MVVM,我应该从后面的View代码或ViewModel启动子窗口吗?

我有一段时间对此感到困惑.我正在RibbonWindow使用MVVM模式编写相当大的WPF应用程序.屏幕RibbonBar顶部有一个菜单,其余部分显示各种视图.某些视图包含其他视图,其中一些视图具有启动子窗口的按钮.

到目前为止,我一直在使用View代码隐藏文件执行此操作,但我知道在使用MVVM时这些文件应该是空的.我可以将子窗口启动代码移动到ViewModel,但是我需要一个对main的引用RibbonWindow(设置为子窗口所有者),这似乎不正确.

关于如何使用MVVM正常实现这一建议或提示将不胜感激.

wpf view mvvm childwindow viewmodel

18
推荐指数
2
解决办法
7796
查看次数

在MVC3中,我应该有单独的"编辑"模型与"显示"模型吗?

使用MVC3,我应该设计我的视图模型,以便有一个绑定到视图(DisplayModel),还有一个回发到控制器(EditModel)?

为了澄清,我不是在询问数据模型与视图模型 - 我知道将视图/控制器绑定到数据/域模型并不好.

我也不是要求跨两个单独的视图共享一个模型,一个用于显示数据的视图,另一个用于编辑数据的视图.

相反,我问的是一个用于编辑数据的视图,以及绑定到视图的模型与绑定到控制器操作的模型.

换句话说,如果这是我的观点:

@model MyApp.Models.CustomerModel
Run Code Online (Sandbox Code Playgroud)

我的控制器动作应该是这样的:

public ActionResult Index(CustomerModel model)
Run Code Online (Sandbox Code Playgroud)

要么:

public ActionResult Index(CustomerEditModel model)
Run Code Online (Sandbox Code Playgroud)

有一次,我们正在做后者(单独).但最近,我们开始做前者(共享).

这种变化的原因是因为:

  1. 使用MVC3不引人注意的验证,如果我在我的模型上使用DataAnnotations进行验证,如果它们是分开的(在显示模型上映射客户端验证,在服务器端验证的编辑模型上),则需要在两个模型中使用它们. .

  2. 随着我们的应用程序的成熟,我们意识到我们的显示和编辑模型是95%相同的,除了我们的视图模型中的选择列表.我们现在将它们移动到一个共享类,现在通过视图传递它们.

但我已经看到其他一些讨论指出,让视图/控制器共享模型是一个坏主意,并且它违反了关注点的分离.

有人可以帮我理解这两种方法的权衡吗?

asp.net-mvc viewmodel asp.net-mvc-3

18
推荐指数
1
解决办法
3180
查看次数

MVC3 - 包含复杂类型列表的Viewmodel

如果以前曾被问过,请道歉; 有一百万种方法来表达它,因此寻找答案已经证明是困难的.

我有一个具有以下属性的viewmodel:

public class AssignSoftwareLicenseViewModel
{
    public int LicenseId { get; set; }
    public ICollection<SelectableDeviceViewModel> Devices { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

SelectableDeviceViewModel的简化版本是这样的:

public class SelectableDeviceViewModel
{
    public int DeviceInstanceId { get; set; }
    public bool IsSelected { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的视图中,我试图在输入表单中显示Devices属性的可编辑复选框列表.目前,我的View看起来像这样:

@using (Html.BeginForm())
{
    @Html.HiddenFor(x => Model.LicenseId)
    <table>
        <tr>
            <th>Name</th>
            <th></th>
        </tr>
        @foreach (SelectableDeviceViewModel device in Model.Devices)
        {
            @Html.HiddenFor(x => device.DeviceInstanceId)
            <tr>
                <td>@Html.CheckBoxFor(x => device.IsSelected)</td>
                <td>@device.Name</td>
            </tr>
        }
    </table>

    <input type="submit" …
Run Code Online (Sandbox Code Playgroud)

model-binding viewmodel checkboxfor asp.net-mvc-3

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

第一次调用后,LiveData不会更新其值

我一直在撞墙,我无法理解为什么会这样.我正在使用Android的新建筑组件,我在使用对象列表更新LiveData时遇到问题.我有两个旋转器.当我更改第一个选项时,第二个必须更改其内容.但最后一部分没有发生.谁能帮我?

State.java

@Entity(tableName = "states")
public class State{

@PrimaryKey(autoGenerate = false)
private int id;

private String name;

@ColumnInfo(name = "countryId")
private String CountryId;

@Ignore
private Object geoCenter, geoLimit;

public State(){

}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCountryId() {
    return CountryId;
}

public void setCountryId(String countryId) {
    CountryId = countryId;
}
} …
Run Code Online (Sandbox Code Playgroud)

android viewmodel dagger dagger-2 android-room

18
推荐指数
1
解决办法
2万
查看次数

具有多个ViewModel的活动

我有一个Activity包含3 RecyclerViews.我需要填充RecyclerViews来自远程存储库的数据(3个不同的请求).我可以使用多个ViewModelsActivity,或者有没有更好的解决办法(最佳实践).

android viewmodel android-architecture-components

18
推荐指数
2
解决办法
9519
查看次数