c# - 使用ViewModel公开嵌套模型

标签 c# wpf mvvm

我正在寻找有关WPF/MVVM应用程序的一些指导。谷歌今天没有帮助我。

所以我有一个带有某些模型(域对象)的应用程序,这些模型具有其他模型作为属性。现在,我只是展平嵌套对象,并在包含对象的ViewModel中公开属性。

随着我的模型变得越来越复杂,我正在努力解决如何分解ViewModels的问题。我正在走向“复合 View ”,其中“包含”对象具有其View&ViewModel,而“嵌套”对象也具有其自己的。这也会给我一些可重用的代码,这将是一个加号。

举一个 super 简单的例子,假设我有一个建筑物,每个建筑物都具有一些属性,并带有如下所示的地址:

public class Building
{
     public string Name { get; set;}
     public Address Address { get; set;}
}

public class Address
{
    public string Number { get; set; }
    public string Street { get; set; }
}

然后,我有一个用于建筑物的ViewModel,以及一个用于地址的ViewModel(由BuildingViewModel公开):
public class BuildingViewModel
{
    public string Name { get; set; } // from model
    public AddressViewModel Address { get; set; } // a wrapped instance of Address
    // INPC, etc... 
}

public class AddressViewModel
{
    public string Number { get; set; } // originally from Building 
    public string Street { get; set; }
    // INPC, etc...
}

因此,没有显示,我有一个BuildingView和一个嵌套的AddressView。我只是先将ViewModel与datatemplates一起使用。

现在,如何使Address对象保持同步?一旦将它们分成两个ViewModel,就得到了Address对象的两个实例。在完成的所有搜索中,我已经看到使用来回传送对象的消息,并且提到了“观察者”模式。

我是朝着正确的方向前进,还是我错过了一些非常简单的事情?任何建议表示赞赏。

FWIW,由于对学习曲线持怀疑态度,所以我已经整理了自己的框架。另外,到目前为止,它还相当简单。

最佳答案

您可以使用地址类型的后端字段将地址存储在AddressViewModel中:

    public class AddressViewModel
    {
        private readonly Address _address;

        public AddressViewModel(Address address)
        {
            _address = address;
        }

        public string Number 
        { 
            get { return _address.Number; }
            set { _adress.Number = value; }
        }
        public string Street
        { 
            get { return _address.Street; }
            set { _adress.Street = value; }
        }
    }

我希望你可以用我的代码做一些事情:-)

编辑:

下次尝试:)

我认为解决问题的最佳方法是使用一些工厂类/方法来获取模型。例如,您有一个具有方法GetAddressList()的AddessList类。该方法返回地址模型对象的列表。在第一个调用之后,您将返回的对象缓存在AddressList类中,对于下一个调用,您将返回缓存的列表。
    public static class AddressList
    {
        private static List<Address> _backend;

        private static AddressList()
        {
            _backend = new List<Address>();
        }

        public static List<Address> GetAddressList()
        {
            if(_backend.Count == 0)
            {
                //Here you can load your models from your data source
            }
            else
            {
                return _backend;
            }
        }
    }

关于c# - 使用ViewModel公开嵌套模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11788854/

相关文章:

c# - 绑定(bind)到 MVVM 中的 TextBlock Width 属性

c# - MVVM 中的绑定(bind) Validation.HasError 属性

javascript - 主干 ViewModel 与(数据)模型

c# - 从LAN读取8位数据并在GUI中显示

c# - 为什么 ("abc"+char.MaxValue).CompareTo ("abc")==0?

c# - DotNetOpenAuth:何时调用 StoreNewRequestToken?

c# - WPF MVVMLight Messenger UI 线程问题

.net - WPF 可编辑数据网格,如 MS Access 和 MVVM

c# - MVVM 中的上下文菜单

c# - MVVM:我应该从我的执行方法中检查我的 "CanExecute"方法吗?