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

时间:2017-12-22 14:59:44

标签: c# xaml data-binding uwp win-universal-app

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

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

我实现这一点的方法是在主页面上创建一个Grid,并为每个可用的Plate添加一个Frame到一个grid列,每个Frame导航到一个自定义的PlateView页面,以显示基本上是一个水平列表PlateView列。

我的问题是我希望能够将每个控件/属性的双向绑定数据从每个Plate到其相应的PlateView。

现在我将所有Plates的列表存储为App.cs中的公共变量,因为我需要能够在整个生命周期内从应用程序的多个部分获取和修改此主列表。

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

使用Plate实现它,PlateView会将其ViewModel设置为List中正确的Plate索引(this.ViewModel = App.plateList [1]),但我认为它会复制......?因此,如果我在PlateView中修改变量,它实际上不会更改App.cs中的Plate对象。

使用新的PlateViewModel类,我不明白我怎么会遇到同样的问题,但是在PlateViewModel类中。例如,MS的文档显示:

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

即使我在PlateViewModel中设置了内部Plate对象,我也不必从XAML {x:bind ...}语法中调用变量吗?所以我必须将每个变量从正确的Plate复制到PlateViewModel中,它们不一定会链接到App.cs中的原始Plate对象吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

要简单回答您的问题而不进入有关MVVM的整个讨论,要使用要绑定的附加ViewModel属性不会创建List的新实例。我要做的是创建一个View Model属性,用getter和setter表示你的模型(在这种情况下,App.cs属性是你的模型):

<强>视图模型

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#中的值类型与引用类型。几乎在你做任何时候&#34; ThisObject = ThatObject&#34;在C#中,您只是在内存中创建指向同一对象的指针。