In a MVVM application, I have a Listbox with a designated SelectedValuePath = "ownerID". After adding a new record to the source data table, I want to regenerate the ListBox for its ItemSource and then select the new item in the ListBox. It all works well until I get to the point where I try to select the item using a DataRowView and ItemContainerGenerator. The row is found, and intellisense displays the correct SelectedValue and DisplayMember for the row ItemArray, but the ItemContainerGenerator for some reason returns a null value for the conversion to a ListBoxItem.
XAML for the ListBox:
<ListBox Grid.Row="0" Grid.Column="0" Margin="17,8,15,26" Name="listBox1" Height="Auto" ItemsSource="{Binding Tables[0]}" DisplayMemberPath="ownerName" SelectedValuePath="ownerID" ScrollViewer.VerticalScrollBarVisibility="Auto" />
C# to bind the data and to select the ListBoxItem:
DataSet dtSet = new DataSet(); private void bindData(object parameter) { try { dtSet.Clear(); string sql = "SELECT ownerID, ownerName FROM owners ORDER BY ownerSort;"; command = new OleDbCommand(sql, GlobalDB.dbConn); OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.SelectCommand = command; adapter.Fill(dtSet, "owners"); mView.listBox1.DataContext = dtSet; adapter.Dispose(); } catch (Exception x) { MessageBox.Show(x.Message); } } private void displayNewOwner(object obj) { int iNewOwnerID = (int)obj; foreach (DataRowView rowView in mView.listBox1.Items) { if (Convert.ToInt32(rowView.Row["ownerID"]) == iNewOwnerID) { ListBoxItem li = mView.listBox1.ItemContainerGenerator.ContainerFromItem(rowView) as ListBoxItem; li.IsSelected = true; } } }
The conversion fails in the displayNewOwner() method. The value for iNewOwnerID is correct. The If() block finds the correct rowView. But "ListBoxItem li" gets a null value even though intellisense shows that rowView contains the correct SelectedValue and DisplayMember in its ItemArray. Then, of course, the code throws an exception at "li.IsSelected = true;".
What am I missing here?
Rob E.