如何维护多个Frames和多个对应对象之间的数据绑定?

How to maintain data binding between multiple Frames and multiple corresponding objects?

我正在开发一个 UWP 应用程序,它本质上是几个相同对象的控制面板 - 我们称它们为 Plate 对象。

在功能上,用户需要能够创建和删除具有特定属性的 Plate 对象,并且所有当前可用的 Plate 对象都显示在主页上,具有相应的独特属性以及修改它们的控件.

他们实现这个的方法是在主页上创建一个网格,并为每个可用的板块,将一个框架添加到网格列中,每个框架导航到一个自定义的 PlateView 页面以显示基本上是什么PlateView 列的水平列表。

我的问题是我希望能够将每个 control/property 的数据从每个 Plate 双向绑定到其对应的 PlateView。

现在我将所有板块的列表作为 public 变量存储在 App.cs 中,因为我需要能够通过它从应用程序的多个部分获取和修改这个主列表完整的生命周期。

按照我对 UWP 文档中数据绑定描述的理解,我的 Plate 对象可以实现 INotifyPropertyChanged,或者我可以创建一个单独的 PlateViewModel class 来实现它。

在 Plate 实现它的情况下,PlateView 会将其 ViewModel 设置为列表中 Plate 的正确索引 (this.ViewModel = App.plateList[1]),但我假设它会生成一个副本。 ..?因此,如果我修改 PlateView 中的变量,它实际上不会更改 App.cs.

中的 Plate 对象

使用新的 PlateViewModel class,我不明白我怎么不会遇到同样的问题,但在 PlateViewModel 内部 class。比如MS的文档显示:

    public class RecordingViewModel
{
    private Recording defaultRecording = new Recording();
    public Recording DefaultRecording { get { return this.defaultRecording; } }
}

即使我在 PlateViewModel 中设置了一个内部 Plate 对象,我是否也不必从 XAML {x:bind ...} 语法中调用一个变量?因此,我必须将每个变量从正确的 Plate 复制到 PlateViewModel,并且它们不一定 link 到 App.cs?

中的原始 Plate 对象

谢谢!

为了简单地回答您的问题而不进入关于 MVVM 的整个讨论,绑定额外的 ViewModel 属性 不会创建列表的新实例。我要做的是创建一个 View Model 属性,用 getter 和 setter 呈现您的模型(在这种情况下,App.cs 属性 是您的模型) :

ViewModel:

public List<Plate> MyPlates
{
    get
    {
        return ((App)Application.Current).MyGlobalListofPlates;
    }
    set
    {
        ((App)Application.Current).MyGlobalListofPlates = value;
        OnPropertyChanged("MyPlates");
    }
}

该代码清楚地表明它不是正在创建的新对象,它使您可以控制允许对数据进行哪些更改。另一种选择是在构造函数中分配 属性 。这也不会创建新对象。它是对原件的引用,您对其所做的任何更改都会反映在所有地方。

public List<Plate> MyPlates { get; set; }

public MyViewModel() //Constructor
{
    MyPlates = ((App)Application.Current).MyGlobalListofPlates;
}

第二个代码块有问题,因为没有 INotify(如果它是双向绑定,这可能无关紧要?不确定...)。无论如何,我只是向您展示将对象分配给另一个对象只是创建一个引用。您肯定想继续阅读 C# 中的值类型与引用类型。几乎任何时候你在 C# 中做 "ThisObject = ThatObject" 你只是在内存中创建一个指向同一个对象的指针。