我在该领域的经验非常少,我正在编写一个使用MVVM与WCF后端通信的WPF智能客户端应用程序,并且我真的很难从所有信息中做出正确的决策.这引出了一系列问题,我希望在这方面有更多经验的人可以解决这些问题.
例如,其中一个屏幕将允许输入订单并向订单添加订单行.
什么用作模型?
在WCF服务上,我有以下简化的DTO:
public OrderDTO
{
string orderDetails { get; set; }
List<OrderLineDTO> OrderLines { get; set; }
}
public OrderLineDTO
{
int customerId { get; set; }
int productId { get; set; }
double quantity { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和WCF服务有以下方法:
public OrderService Order
{
CreateOrderResponse CreateOrder(OrderDTO order)
}
Run Code Online (Sandbox Code Playgroud)
在我的WPF智能客户端中,我有一个对DTO的引用,但显然它没有实现,INotifyPropertyChanged
因为它纯粹是为了传输.
问题
建议的方法是将这些DTO转换为INotifyPropertyChanged
使用Automapper或类似方法实现的模型吗?或者DTO应该直接在ViewModel中用作模型?
在视图模型之间进行通信
目前,我有一个带有ViewModels 和2的标签(Order
和OrderLines
)的订单视图.在订单选项卡上,我有一个包含客户ID和名称.当我选择客户时,我需要告知客户已被选中,以便仅显示属于该客户的产品.OrderViewModel
OrderLineViewModel
ComboBox
OrderView
OrderLineView
ComboBox
问题
在这种情况下如何OrderViewModel
沟通OrderLineViewModel
?
添加订单行并应用逻辑/业务规则
由于服务器级应用程序将由多个客户端使用,例如PC,移动设备..我想确保所有业务规则都应用于服务器级应用程序.例如,添加订单行时.如果是某种产品类型,只有在客户有特定认证的情况下才能添加.
但是,我所读到的关于MVVM的所有内容都表明该模型适用于业务规则和行为 …
感谢我之前在Stack Overflow上提出的一些建议,我在理解MVVM方面取得了很好的进展.然而,当事情开始变得更加复杂时,我仍然在苦苦挣扎.
我在下面的视图是为了输入订单.它绑定到OrderScreenViewModel的DataContext.
<StackPanel>
<ComboBox Height="25" Width="100" DisplayMemberPath="CustomerCode" SelectedItem="{Binding Path=Order.Customer}" ItemsSource="{Binding Path=Customers}"></ComboBox>
<ComboBox Height="25" Width="100" DisplayMemberPath="ProductCode" SelectedItem="{Binding Path=CurrentLine.Product}" ItemsSource="{Binding Path=Products}"></ComboBox>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
第一个组合框用于选择客户.第二个组合框用于为新的OrderLine选择ProductCode.
有迹象表明,我不知道如何在MVVM实现的项目:
1) 当客户选择更新的产品组合框,以便其项目源只能说明具有相同的CustomerID作为在下拉列表中选择的CustomerDto记录产品
2) 当调用Load会在Customers组合框中设置SelectedItem,以便显示CustomerId等于OrderDto上的CustomerId.
3) 应用与1)相同的过程,以便只显示/加载属于该Customer的产品,并在Products组合框上设置SelectedItem,使其指向与OrderLineDto中包含的ProductId相同的条目
我不知道如何继续,或者即使我的视图模型的责任是正确的.也许它与NotifyPropertyChanged有关?任何有关如何实现上述目标的指示将不胜感激.我相信如果我做对了,它会在我的应用程序中帮助我.非常感谢Alex.
public class OrderScreenViewModel
{
public WMSOrderViewModel Order { get; private set; }
public WMSOrderLineViewModel CurrentLine { get; private set; }
public OrderScreenViewModel()
{
Order = new WMSOrderViewModel();
CurrentLine = new WMSOrderLineViewModel(new OrderLineDto());
}
public void Load(int orderId)
{
var orderDto = new OrderDto { CustomerId = 1, Lines = new …
Run Code Online (Sandbox Code Playgroud) 我有一个场景,我有一个包含3罐的标准盒子.出于显示和查询的目的,我必须根据其标准配置的十进制数量进行报告.不可能说1盒3罐,1盒2罐......等等
例如,最初我将具有 的3罐1盒
然后我除去1种可导致 0.66的重复的3罐箱
然后我删除1以上即可,导致 0.33的重复的3罐箱
然后我除去,以生成最终罐0.0000000000000000000000000001的框3罐
当我删除最终的罐头时,我希望该值为0盒3罐,因为现在每个罐子都已从原始盒子中移除.我很欣赏由于在处理有限数量的位时无法表示0.33重复这一事实而导致精度损失.
问题:对于那些需要使用舍入(可能是财务)的系统有更多经验的人,我有哪些选择来解决这个问题?如何删除最后一个可能意味着该框不再存在?
编辑:
最后.我用洛伦Pechtel建议和存储罐的数量然后当我需要证明我有多少标准盒将罐的总人数的罐头标准箱仍然给出了一个递归结果的数量,但是这是罚款报告事情的一面.
以下是一些代码,我希望这些代码可以帮助更多地概述问题: -
static void Main(string[] args)
{
var box = new StandardBox(3);
var boxDetail = new BoxDetail(1.0m, box);
var allBoxes = new AllBoxes();
allBoxes.AddBox(boxDetail);
allBoxes.RemoveItemFromBox(boxDetail, 1.0m);
Console.WriteLine(allBoxes);
allBoxes.RemoveItemFromBox(boxDetail, 1.0m);
Console.WriteLine(allBoxes);
allBoxes.RemoveItemFromBox(boxDetail, 1.0m);
Console.WriteLine(allBoxes);
Console.ReadLine();
}
}
public class StandardBox
{
private decimal _quantity;
public StandardBox(decimal quantity){_quantity = quantity;}
public decimal Quantity {get { return _quantity; }}
}
public class BoxDetail …
Run Code Online (Sandbox Code Playgroud) 我对这个设计并不熟悉,但我希望得到一些指导.
我有一个后端服务,将DTO发送到WPF智能客户端.在WPF智能客户端上,用户将更改,删除和修改项目,然后发送回更改(客户端 - >服务器).例如,目前我正在处理客户详细信息表单,用户可以在数据网格中添加,删除和更改属于客户的类别.当DTO被发送回服务器时,我想加载与DTO中的ID相关的域对象,并将对DTO所做的更改应用于域对象,包括所有子集合.
我尝试使用UpdateCustomer方法在下面的代码中执行类似的操作.但是,我认为我的观点不合时宜.当代码运行而不是最终列出{个人,公司,非政府组织,政府}时,我最终得到了{个人,B2B,公司,非政府组织,政府}的清单,因为它显然没有从中删除B2B条目原始清单.
我遇到的一个选择是遍历DTO集合并将其与域对象中的集合进行比较,并根据已修改的内容添加,删除和更新.然而,这看起来真的很麻烦.
我需要做什么才能将DTO中的更改应用到我的domiain对象中的子集合中?
非常感谢您的任何帮助,我们将非常感激
亚历克斯
public class Customer
{
public virtual int Id { get; set; }
public virtual IList<Category> Categories { get; private set; }
public virtual string Code { get; set; }
public virtual string Description { get; set; }
public Customer()
{
Categories = new List<Category>();
}
public virtual void AddCategory(string categoryName)
{
Categories.Add(new Category(categoryName));
}
}
public class Category
{
public virtual string CategoryName { get; …
Run Code Online (Sandbox Code Playgroud) 我完全没有AS400 DB2的经验,所以请原谅任何明显的错误,因为我正在学习.我有2盒,我可以连接到运行V5R3或V4R3. 我正在使用NHibernate 3.但是,当我尝试连接时,我不断得到以下异常: -
ERROR [08001] [IBM] SQL30081N A communication error has been detected.
Communication protocol being used: "TCP/IP". Communication API being used: "SOCKETS".
Location where the error was detected: "192.168.1.11". Communication function detecting the error: "connect". Protocol specific error code(s): "10061", "*", "*". SQLSTATE=08001
Run Code Online (Sandbox Code Playgroud)
下面是我的NHibernate配置文件: -
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.DB2400Dialect</property>
<property name="connection.driver_class">NHibernate.Driver.DB2Driver</property>
<property name="connection.connection_string">Server=192.168.1.11;Database=TESTDB;UID=XXX;PWD=XXX; </property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="command_timeout">15000</property>
<property name="current_session_context_class">thread_static</property>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
我不确定这是不是因为AS400的版本太早了?我的nhibernate配置不正确?或者我在AS400上设置了错误的东西.
任何建议都将非常感激.
提前谢谢了
我目前正在考虑尝试在 Python 中使用回调。
我想做的是从回调中返回一个值,然后使用该返回值进行条件处理。例如,如果用户输入“Y”,我想在控制台上打印一些内容。
由于我是 Python 新手,下面的代码是我目前所能得到的最接近的代码,但是:
a) 我不确定这是否是 Pythonic 的做法
b) 正确的做法是?
class Observable:
def subscribe(self,callback):
self.callback = callback
def fire(self):
self.callback()
class CallBackStuff:
def doCallback(self):
userInput = raw_input("Please enter Y or N?")
return userInput
if __name__ == '__main__':
s = CallBackStuff()
o = Observable()
o.subscribe(s.doCallback)
t = o.fire()
print t
Run Code Online (Sandbox Code Playgroud) c# ×3
mvvm ×2
nhibernate ×2
prism ×2
wpf ×2
algorithm ×1
automapper ×1
combobox ×1
database ×1
decimal ×1
dns ×1
dto ×1
ibm-midrange ×1
python ×1
rounding ×1
smartclient ×1
wcf ×1