(SL4中的MVVM Light)
我的DisplayWorkOrder视图有一个名为WAREHOUSE_CODE的字段。在我的ViewModel中,我绑定到该属性。如果我使用文本框并设置我的Text =“{Binding WAREHOUSE_CODE}”,然后打开现有的WorkOrder,我的文本框将填充WAREHOUSE_CODE(例如Lombard)的值。如果我将文本框更改为组合框,我有问题。
组合框设置如下:
<ComboBox Grid.Column="1" Grid.Row="1"
x:Name="cboWarehouse"
Margin="4"
ItemsSource="{Binding Path=Warehouses}"
SelectedValue="{Binding Path=WAREHOUSE_CODE, Mode=TwoWay}" />
我的仓库属性简单(对于设计模式)我在ViewModel的构造函数中构建的列表:
Warehouses = new List<string> {
"Docks",
"Pearl",
"Lombard",
"Powell",
"Goose Hollow"
};
当我加载空白工单时,我的组合框已正确填充此列表。但是,当我选择现有的工作订单时,我的组合框是空白的。我不仅不为该工单显示selectedValue,而且我的ItemsSource似乎不再具有绑定性。
作为旁注,当我选择现有的WorkOrder(通过ChildWindow / Messaging)时,我在我的视图中重载构造函数:
public DisplayWorkOrder(Model.BWorkOrder workOrder)
{
InitializeComponent();
this.DataContext = workOrder;
}
如果我在这里设置断点,则workOrder.WAREHOUSE_CODE设置属性,所以我对发生的事情感到困惑。
有什么想法吗?
为Stephan的评论编辑 因此,通过将我的DataContext设置为workOrder,我将丢失设置为ViewModel的组合框中的上下文。我想将datacontext设置为我的ViewModel。所以目前我这样做......
在我的ListWorkOrdersViewModel中,在用户选择要查看的工单后,我使用RelayCommand(实现iCommand接口)使用令牌“WOSelected”发送BWorkOrder类型的消息。我还通过消息传递了我的对象引用。在我的MainPage.xaml.cs(不为此感到自豪,我需要一个消息类来处理这些东西!),我订阅了该代码块:
Messenger.Default.Register<NotificationMessage<Model.BWorkOrder>>(
this, nm =>
{
if (nm.Notification == "WOSelected")
{
RightContent.Content = new Views.DisplayWorkOrder(nm.Content);
}
});
所以在这种情况下,我将我的框架的content属性设置为实例化的DisplayWorkOrder,重载构造函数&amp;传入我的WO对象。
要将我的DisplayWorkOrderView的datacontext保存到其ViewModel(而不是将其设置为workOrder对象),我将在BWorkOrder类型的DisplayWorkOrderViewmOdel中有一个属性,将我的消息从ListWorkOrderviewModel发送到DisplayWorkOrderViewModel,并将我的workOrder对象设置为相等到属性(BWorkOrder类型),然后将我的DisplayWorkOrder的datacontext绑定到该属性?
希望这不会太混乱:)