Я хотел бы обновить содержимое Silverlight 4 combobox на открытии.Silverlight 4: Как сделать combobox обновить его ItemsSource при открытии
Это похоже на тупо-простую вещь, которую хочется делать, но я не могу для жизни меня найти прямой ответ.
У меня есть форма в приложении Silverlight 4 с выпадающим списком, в котором перечислены номера заказа клиента. У многих людей эта форма будет открыта в одно и то же время, поэтому я бы хотел, чтобы она перезвонила в веб-сервис ON OPEN и обновила его содержимое.
Ближе всего я нашел это:
http://blogs.msdn.com/b/kylemc/archive/2010/06/18/combobox-sample-for-ria-services.aspx
..which Я не мог работать и не в любом случае не поможет мне. В этом примере ничего нет, что позволяет мне повторно заполнять раскрывающийся список, когда он открывается.
Я использую MVVM и использовал классы интерактивности для перекачки события Open comboBox в мой ViewModel. Там я вызываю webservice и сбрасываю базовое свойство, которому привязан элемент ItemsSource comboboxes. Не работает - выпадающее меню мигает в течение секунды, а затем открывается, пустое.
UPDATE:
XAML:
<ComboBox x:Name="cmbOrderNumber" Width="125"
ItemsSource="{Binding ActiveSalesOrderNumbers, Mode=TwoWay}"
IsEnabled="{Binding OrderSelectorEnabled}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<inf:InvokeDelegateCommandAction Command="{Binding SalesOrderSelectedCommand}" CommandParameter="{Binding ElementName=cmbOrderNumber, Path=SelectedValue}"></inf:InvokeDelegateCommandAction>
</i:EventTrigger>
<i:EventTrigger EventName="DropDownOpened">
<inf:InvokeDelegateCommandAction Command="{Binding SalesOrderOpenedCommand}"></inf:InvokeDelegateCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
C#:
public void OnSalesOrderOpenedCommand(object o)
{
_companyContext.Load(_companyContext.GetSales_Order_Numbers_FromDateQuery(_lastSalesOrderRequest), q =>
{
if (!q.HasError)
{
q.Entities.ToList().ForEach(e =>
{
ActiveSalesOrderNumbers.Add(e.Sales_Order_Number);
});
_lastSalesOrderRequest = DateTime.Now;
}
else
{
throw new Exception("Error updating sales order number list.");
}
}, null);
}
Событие сработал, и я наблюдал, как данные возвращаются, как и ожидалось от службы и добавить новый пунктов к ActiveSalesOrderNumbers
, который является ObservableCollection. В раскрывающемся списке НЕ обновляется, нет новых записей.
У меня есть событие, запускающее команду в моем ViewModel, нет проблем. Это работает. Команда вызывает веб-сервис и устанавливает найденную коллекцию в свойстве ViewModel. Проблема в том, что это асинхронный вызов, поэтому всплывающие окна всплывают до завершения вызова, и нет элементов. –
Мои знания об асинхронном вызове немного шаткие. Не можете ли вы установить триггер, когда он откроется в первый раз? Однако это скорее хак, чем реальное решение исходной проблемы. Может быть, вам нужно загрузить данные перед загрузкой? – JeroenEijkhof