(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 с этим свойством?
Надеюсь, это не слишком смущает :)