【问题标题】:MVVM - Summary/DetailMVVM - 摘要/详细信息
【发布时间】:2012-08-19 14:34:12
【问题描述】:

所以我试图围绕 MVVM 进行思考,但我发现我的问题多于答案。当涉及到下一步时,这些教程对我来说还远远不够......

基本上我想要一个项目列表,然后是获取每个项目详细信息的方法。

以下是我在网上找到的示例,它们非常适合显示列表,但我需要知道如何使用我的 VM 来获取此项目的详细信息。

private IList<item> m_items;
private IList<item> m_Item;


private IList<item> getItemDetail(Int32 iId)
{
    var myItem =
        from i in items
        where i.iId == iId
        select i;

    m_Item = new List<item>();
    foreach (var item in myItem)
    {
        m_Item.Add(item);
    }
    return m_Item;
}

public myViewModel()
{

    m_items = new List<item>
    {        
    new item(1, "test,),
    new item(2, "test2"),
    new item(3, "test1")
    };

    m_Item = new List<item>();
    m_Item = getItemDetail(iId);

}

更新:

我更新了上面的视图模型代码。我认为我所做的是我添加了另一个列表,当用户导航到详细信息页面时,视图模型会使用特定 ID 调用,然后填充详细信息列表。我可能不需要这里的列表,但我想尽量保持它与主页代码一致。

在我的详细信息页面中,我以这种方式设置 VM:

    itemViewModel VM = new itemViewModel((Int32)navigationParameter);
    DataContext = VM;

当我打破 VM 变量时,我看到了我的 2 个列表。但是,我的绑定不适用于 XAML。如果我需要发布一些示例 XAML,请告诉我。我可以做到这一点,但我希望我在这里缺少一些东西。

我正在努力学习 MVVM,我想把事情做好。因此,与其继续走错路,我真的很想知道“正确”的做事方式。因此,如果您发现错误,请告诉我。

谢谢!

【问题讨论】:

    标签: xaml mvvm windows-runtime winrt-xaml


    【解决方案1】:

    是的,我建议你先回到基础并观看 Laurent 关于 MVVM 的 Mix 会议,你可以从 codeplex 上的 mvvmlight 站点找到链接。

    但要分解它,你已经遇到了我刚开始时遇到的一些障碍。

    1:(最大的问题)要使数据绑定起作用,您必须使用属性(获取和设置模式)公开数据,只是列表变量不起作用。这适用于您要绑定的所有内容。另一种方法是直接在代码中设置项目来源,但您将失去数据绑定的所有功能,包括更新。

    2:要了解数据绑定,您需要了解 INotifyProperty 更改模式,这是使绑定正常工作的底层 gubbins(技术术语;-D)。按照建议开始一个新的“主/详细信息”项目模板并遍历它,从保存数据的视图模型到查看视图模型中数据的视图(页面)

    3:对列表使用 observablecollections,它们更适合绑定,基本上只是带有附加功能的列表

    4: 请记住,您还可以绑定列表框的“selecteditem”或“selectedindex”来捕获用户选择的内容,只需确保将绑定设置为“twoway”,以便视图可以将数据推送到视图模型和不只是阅读,像这样:{binding myselecteditem, mode="twoway"}

    希望这会有所帮助,但如果您仍然卡住的 Laurents 视频是最好的,只需多看几遍,然后逐行跟随他的操作

    【讨论】:

      【解决方案2】:

      我相信您想使用 Microsoft 所谓的“主从绑定方案”,其中多个控件绑定到单个集合或其选定项。为此,您需要绑定到所谓的集合视图,它只是 WPF 使用的集合之上的一个层。例如,您可以将 ListBox 的 ItemSource 和 ContentControl 的 Content 绑定到同一个集合视图,ContentControl 将显示 ListBox 所选项目的详细信息。

      见:http://msdn.microsoft.com/en-us/library/ms752347.aspx#master_detail_scenario

      附:您可能希望使用 ObservableCollection 而不是 List,并确保您的视图模型实现 INotifyPropertyChanged。

      【讨论】:

      • 我的愿望是让这个项目超级简单......这是完成我想要的最好的方式吗?我不想让这个超级复杂。因此,如果有另一种更简单的方法,我也会有兴趣看到该选项。
      • 如果你尝试实现它,你会发现它最终变得非常简单:1) 通过声明 CollectionViewSource 创建集合视图,2) 为 ListBox 和 ContentControl 创建 DataTemplates 以显示你的内容想要,并且 3) 将 ListBox 的 ItemsSource 和 ContentControl 的内容绑定到集合视图。 stackoverflow.com/questions/1183176/… 给出了一个我认为不太优雅和灵活的替代解决方案
      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多