MVVMLight Combobox Binding Silverlight4 - PullRequest
0 голосов
/ 26 января 2011

(MVVM Light в SL4)

В моем представлении 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}" />

Свойство My Warehouses - это просто (для режима разработки) список, который я строю в конструкторе моей 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 будет установлен правильно, поэтому меня смущает то, что происходит.

Есть идеи?

РЕДАКТИРОВАТЬ комментарий Стефана Таким образом, имеет смысл, что, устанавливая мой DataContext равным workOrder, я теряю контекст в своем комбинированном ящике, который установлен в моей ViewModel. Я ХОЧУ, чтобы текст данных был установлен для моей ViewModel. Так что в настоящее время я делаю это ...

В моем ListWorkOrdersViewModel после выбора пользователем рабочего задания для просмотра я использую RelayCommand (реализующий интерфейс iCommand) для отправки сообщения типа BWorkOrder с использованием токена «WOSelected». Я также передаю ссылку на объект через сообщение. В моем файле MainPage.xaml.cs (не горжусь этим, мне нужен класс обмена сообщениями для обработки этого материала!), Я подписываюсь на этот блок кода:

Messenger.Default.Register<NotificationMessage<Model.BWorkOrder>>(
            this, nm =>
            {
                if (nm.Notification == "WOSelected")
                {
                    RightContent.Content = new Views.DisplayWorkOrder(nm.Content);

                }
            });

Так что в этом случае я устанавливаю свойство содержимого моего фрейма в экземплярный экземпляр DisplayWorkOrder, перегружая конструктор и передавая мой объект WO.

Чтобы сохранить текст данных моего DisplayWorkOrderView в его ViewModel (вместо того, чтобы устанавливать его для объекта workOrder), у меня было бы свойство в моем DisplayWorkOrderViewmOdel типа BWorkOrder, отправьте мое сообщение из ListWorkOrderviewModel в объект DisplayWorkOrderViewModer и установите равным объекту WorkWorOder к свойству (типа BWorkOrder), а затем связать текст данных моего DisplayWorkOrder с этим свойством?

Надеюсь, это не слишком смущает :)

...