【问题标题】:MVVM opening new Workspace from Other Workspace (instead of Main ControlPanel)MVVM 从其他工作区(而不是主控制面板)打开新工作区
【发布时间】:2009-06-29 05:14:55
【问题描述】:

我正在使用 Josh Smith 在http://msdn.microsoft.com/en-us/magazine/dd419663.aspx 创建的示例学习 MVVM 我想在现有代码中添加更新功能,

就像当用户在“所有客户”的网格上看到数据时,用户可以通过双击来编辑特定记录,双击将打开新选项卡(用于新客户的相同视图/视图模型)。我不知道该怎么做,我必须通过 mainwindowviewmodel 调用它还是有其他方式。

谢谢大家,祝编程愉快

高拉夫·乔希

【问题讨论】:

    标签: .net wpf mvvm


    【解决方案1】:

    这有点牵扯,所以让我们一次做一件事:

    您需要做的第一件事是让 View Model 知道选择了哪个项目。 为此,您需要向 Customer 添加一个 IsSelected 属性

    public bool IsSelected { get; set; }
    

    (编辑:正如向我指出的那样,CustomerViewModel 类已经具有此属性,因此对于该特定项目而言,上述内容不是必需的 - 尽管通常是这样。)

    然后您需要将 IsSelected 属性数据绑定到 ListView 中的项目。一种方法是通过以客户为目标的风格。像这样的:

    <Style x:Key="CustomerListStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
    </Style>
    

    然后使用 ListView 的 ItemContainerStyle 分配这个样式:

    <ListView ItemContainerStyle="{StaticResource CustomerListStyle}" ...>
    

    为了能够编辑选定的客户,您应该向 AllCustomersViewModel 添加一个 EditCostumer 命令。使用 RelayCommand 实现此命令以显示所选项目的编辑视图。

    您可以使用 LINQ 查找具有IsSelected == true 的客户。

    【讨论】:

    • 嗨,马克,谢谢你的帖子,对不起,我正在用 cmets 写,在 stackoverflow 上没有找到任何其他回复方式。您是否认为可以声明“工作区”静态并在 customerviewmodel 中创建新命令,这将创建新工作区并将其添加到 mainwindowviewmdodel 工作区。这样就不必实施 isselected。只是想要一些专家意见谢谢Gj
    • 一般来说,我尽量远离静态,因为它往往会损害可测试性、灵活性和一般的 OO 特性。 ViewModel 的全部意义在于它们对 View 进行建模。如果没有模型的实例,则每个视图不能有一个模型。无论如何,可能只有一个工作区,但我想说的是,使用静态与 MVVM 背后的整个理念背道而驰。我知道我的推理听起来有点模糊,但这些只是基于多年经验的一般考虑:)
    • 马克。我在您的回复中看到的唯一问题是您建议将 IsSelected 属性放在客户模型中。我认为它应该放在 CustomerViewModel 类中,因为它是一个面向 GUI 的属性,而 Customer Model 对象确实不知道被选中的含义。
    • 我刚刚再次检查,该项目确实已经具有 CustomerViewModel 类的 IsSelected 属性。
    • @Tim Rupe:你是绝对正确的——我的错。我将根据您的观察编辑我的答案。谢谢。
    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    相关资源
    最近更新 更多