MVVMLight Combobox绑定Silverlight4

时间:2011-01-26 07:13:21

标签: c# silverlight combobox mvvm-light

(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绑定到该属性?

希望这不会太混乱:)

0 个答案:

没有答案