1

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

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

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

作为一个超级简单的例子,假设我有一个建筑物,每个建筑物都有一些属性和一个地址,如下所示:

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 与数据模板一起使用。

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

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

FWIW,我拼凑了自己的框架,因为我一直对学习曲线持怀疑态度。另外,到目前为止它相当简单。

4

2 回答 2

1

我认为您当前的方向是暴露太多信息,并防止模型和视图模型松散耦合。

我将只有一个封装所有数据(建筑物和地址)的模型实例。任何视图模型都将通过静态方法获取这一实例。

然后我会在模型中公开查询你的数据库的查询方法,例如返回一个结果列表,然后你可以用它来填充你的视图。

请注意,列表不必是建筑物或地址的列表,每个列表项都将包含对您的视图模型最有用的内容,例如来自建筑物的一些字段,以及来自嵌套地址记录的其他字段。

顺便说一句,Wpf 有一个很好的机制,可以直接将 viewmodel 数据与视图链接起来,例如带有列表框的查询结果,而 viewmodel 不需要知道任何关于视图的信息。

于 2012-08-03T05:19:10.760 回答
1

您可以使用地址类型的后端字段将您的地址存储在您的 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;
            }
        }
    }
于 2012-08-03T09:07:57.687 回答