【问题标题】:How to maintain data binding between multiple Frames and multiple corresponding objects?如何维护多个Frame和多个对应对象之间的数据绑定?
【发布时间】:2018-06-05 05:24:08
【问题描述】:

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

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

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

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

现在,我将所有板的列表作为公共变量存储在 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 对象?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    为了简单地回答您的问题而不深入讨论有关 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# 中的值类型与引用类型。几乎每次你在 C# 中执行“ThisObject = ThatObject”时,你只是在内存中创建一个指向同一个对象的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多