Фон
Приложение имеет представление списка, связанное со списком «Заданий», свойства которых редактируются некоторыми выпадающими списками (с двухсторонним связыванием). Контекст данных комбинированных списков изменяется на текущий выбранный job
с помощью события SelectionChanged
представления списка.
Значение комбинированного списка связано со свойством Job. itemssource
задания изменяется на совершенно другой список после DataContextChanged
.
Компоновка виджетов
Выпуск
Связанное свойство со списком заданий задано равным нулю при изменении DataContext.
При просмотре списка заданий все свойства, связанные с любым комбинированным списком, устанавливаются в нуль.
Предполагаемая проблема
Я могу ошибаться в этом предположении ...
При переключении datacontext
либо старый выбранный Job
, либо новый выбранный Job
устанавливается равным нулю, как это делает источник элементов. n для хранения значений в одном из новых или старых выбранных Job
.
попыток отладки (Правка)
Я заметил значение свойство Job
было установлено равным нулю до изменения SelectedItem
списка заданий.
Вопрос
Как можно значение связанного свойство Job
сохраняется при переключении текстового контекста ComboBox на источник данных, который не содержит SelectedValue
? * 10 53 *
Соответствующий код (Сокращенный - Привязка к другим виджетам работает как положено)
<ComboBox x:Name="ContactField" Grid.Column="1" Grid.Row="3" Margin="2,1" Grid.ColumnSpan="3" DisplayMemberPath="Value" SelectedValuePath="Id" SelectedValue="{Binding Contact,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectionChanged="ContactField_SelectionChanged"/>
Код сзади - Изменение элементов источника
private void UpdateCustomerDependancies()
{
imprintDataSetTableAdapters.CustomerContactsTableTableAdapter rpcdtta = new imprintDataSetTableAdapters.CustomerContactsTableTableAdapter();
IList<ComboData> customers = new List<ComboData>();
if (LeftFieldPanel.DataContext != null) //Where LeftFieldPanel contains all comboboxes
{
Job currentJob = (Job)LeftFieldPanel.DataContext;
foreach (DataRow item in rpcdtta.GetDataBy(currentJob.CustomerCode).Rows)
{
customers.Add(new ComboData() { Id = item.ItemArray[0].ToString(), Value = item.ItemArray[1].ToString() });
}
ContactField.ItemsSource = customers;
}
}
Код позади - изменение контекста данных
private void jobTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (jobTree.SelectedItem.GetType() == typeof(Job))
{
DelGrid.Visibility = Visibility.Hidden;
Job j = (Job)jobTree.SelectedItem;
MessageBox.Show(j.Contact);
LeftFieldPanel.DataContext = j; //Switch datacontext
RightFieldPanel.DataContext = j; //switchdata context
}
}