0

场景:需要从 Web 服务收集对象集合并将它们呈现在 GUI 中。该对象包含对另一个对象(外键)的引用,我也需要表示这个相关对象。

我有两种可能的选择,它们各自的缺点:

  1. 发送“通过电线”整个相关对象。
  2. 仅发送外键并检索查询另一个集合的相关对象(以前存储在本地)

第一个选项使数据绑定(我在客户端使用 WPF)直截了当,尽管它在通信中引入了显着的开销(特别是如果相同的相关对象出现很多次)。因此,这似乎不是要走的路。

第二个选项实现了更小的消息,它似乎是要走的路。但是,我找不到执行与此相关对象的数据绑定的方法

让我用一个例子来澄清这个问题:

对象 -> 房间 || 相关对象 -> 建筑 || 本地存储的集合 -> 建筑物

来自 Web 服务的消息包含房间属性(比如说“名称”、“大小”……)和“BuildingId”。我希望能够在 UI 中显示(通过数据绑定自动)来自建筑物的信息,而不仅仅是“BuildingId”。因此,我必须查询“Buldings”集合以获取正确的建筑对象,然后使用它的属性来填充 UI似乎是合乎逻辑的。

所以,我的问题是:

  1. 如何通过 WPF 中的数据绑定来实现这一点?我想有一种自动的方法可以实现这一目标。没有吗?
  2. 我是否缺少任何基本概念(与数据绑定相关)?我是 .NET 堆栈的新手,所以这可能比我看起来更容易!

谢谢你们!;)

PS:任何可以为我指明正确方向的文档/链接将不胜感激;)

4

2 回答 2

1

我将在 Room 对象上有一个名为 Building 的属性,该属性最初可以为空(null),但稍后在您加载建筑对象时设置。你的房间对象应该实现INotifyPropertyChanged当对象最终加载并导致所有绑定刷新时通知 UI。

示例 INotifyPropertyChanged 实现:

private bool _Active;
public bool Active
{
    get { return _Active; }
    set
    {
        if (_Active == value)
            return;

        _Active = value;
        OnPropertyChanged("Active");
    }
}

#region PropertyChanged Implementation

        // Code Below Copied From : http://www.codeproject.com/KB/cs/PropertyNotifyPart1.aspx
        /// <summary>
        /// Raises the <see cref="E:PropertyChanged"/> event.
        /// </summary>
        /// <param name="propertyName">
        /// Name of the property that changed.
        /// </param>
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
            OnPropertyChanged(e);
        }

        /// <summary>
        /// Raises the <see cref="E:PropertyChanged"/> event.
        /// </summary>
        /// <param name="e">
        /// The <see cref="PropertyChangedEventArgs"/> instance
        /// containing the event data.
        /// </param>
        protected void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler temp = this.PropertyChanged;
            if (null != temp)
                temp(this, e);
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            PropertyChangedEventHandler temp = this.PropertyChanged;
            if (null != temp)
                temp(sender, e);
        }

        #endregion
于 2012-12-10T16:48:32.020 回答
1

尝试将您的两个选项与 .Net/WPF 世界中的典型方法相关联(以相反的顺序):

方法 2: 模型-视图-视图模型方法 (MVVM) 可能是一种方法。您的 DTO 旨在使用 WCF(模型)优化消息传递。MVVM 原则建议您不应因数据绑定等问题而污染它们。一个单独的类 ViewModel 对此负责,并且还可以管理诸如使用缓存查找等将原始标识符(例如 BuildingId)映射到对象的可绑定表示等问题。而不是绑定到 DTO,然后您的 WPF 视图绑定到 ViewModel .

如果您想采用此选项,请了解MVVM 概念,然后您可能需要考虑使用工具来提供帮助。(我发现Caliburn Micro非常出色,但 WPF 也有一些)

方法 1: 这是更简单的方法,意味着您编写 WCF 服务,以便将预制的 ViewModel 从服务器提供给客户端(即,您的 DTO 和 ViewModel 是同一件事)。正如您已经观察到的,由于构建 ViewModel 的责任是在服务器上完成的,您可能会遇到传输冗余数据的问题。这种方法还意味着客户端和服务器非常紧密地耦合——每个 DTO/ViewModel 都设计用于特定的 View。

最终,最佳方法取决于您的应用程序的要求。如果您正在寻找一种简单的方法,您不关心一些冗余数据通信并且只想尽快找到解决方案,那么方法 1 可能更可取。

但是,如果您需要服务其他客户端,或者出于其他原因避免将客户端和服务器耦合很重要,或者需要高效通信,则应考虑使用 MVVM 方法。

于 2012-12-10T22:54:20.657 回答