Reputation: 1017
It seems that I have this problem very often when working with comboboxes so my question will have 2 parts, First what am I doing wrong and why? I use Prism for many reasons, one of which is because I don't have to type out a viewModelBase
(INotifyPropertyChanged
class).
I like to have a list of records on the left side of the view to allow the end user to easily choose a record to view. In this case it is a DataGrid
:
<DataGrid Grid.Column="0"
Grid.Row="3"
AutoGenerateColumns="False"
Grid.RowSpan="4"
IsReadOnly="True"
SelectedItem="{Binding SelectedSweepModel, Mode=TwoWay}"
ItemsSource="{Binding DatesList}">
<DataGrid.Columns>
<DataGridTextColumn Header="Street"
Binding="{Binding Street.StreetName}" />
<DataGridTextColumn Header="Date"
Binding="{Binding DateSwept}" />
<DataGridTextColumn Header="Last Name"
Binding="{Binding Employee.LastName}" />
<DataGridTextColumn Header="Last Name"
Binding="{Binding Employee.FirstName}" />
</DataGrid.Columns>
</DataGrid>
It is bound to an ItemSource
called DatesList
that is a List<Model>
: (please note that SetProperty
is Prism's INotifyPropertyChanged
) and the SelectedSweepModel
private List<SweeperModel> _datesList;
public List<SweeperModel> DatesList
{
get { return _datesList; }
set { SetProperty(ref(_datesList),value); }
}
private SweeperModel _selectedSweepModel;
public SweeperModel SelectedSweepModel
{
get { return _selectedSweepModel; }
set { SetProperty(ref (_selectedSweepModel), value); }
}
SweeperModel:
public class SweeperModel
{
public Streets Street { get; set; }
public Streets IntersectingStreet1 { get; set; }
public Streets IntersectionStreet2 { get; set; }
public EmployeeModel Employee { get; set; }
public string Quad { get; set; }
public string Block { get; set; }
public bool Am { get; set; }
public bool Pm { get; set; }
public DateTime DateSwept { get; set; }
public string UnitsRange { get; set; }
}
The comboBox is bound to a property in the SweeperModel
called Street
:
<ComboBox Grid.Column="2"
Grid.Row="1"
ItemsSource="{Binding StreetList}"
SelectedItem="{Binding SelectedSweepModel.Street}"
DisplayMemberPath="StreetName" />
The Streets
class has 2 properties:
public class Streets
{
public string StreetName { get; set; }
public int StreetID { get; set; }
}
private List<Streets> _streetList;
public List<Streets> StreetList
{
get { return _streetList; }
set { SetProperty(ref (_streetList), value); }
}
When I select an Item
nothing populates in the combobox. Now my question, what am I doing wrong?
Populating the Lists I run a stored procedure that returns a dataset with 3 tables.
and The 3 methods that populate the lists:
private void FillStreetList(DataTable dt)
{
var myList = (from DataRow dataRow in dt.Rows
select new Streets()
{
StreetID = dataRow.Field<int>("StreetID"),
StreetName = dataRow.Field<string>("Streets")
}).ToList();
StreetList = myList;
}
private void FillEmployeeList(DataTable dt)
{
var myList = (from DataRow dataRow in dt.Rows
select new EmployeeModel()
{
Id = dataRow.Field<int>("EmployeeID")
,
FirstName = dataRow.Field<string>("FirstName")
,
LastName = dataRow.Field<string>("LastName")
,
Phone = dataRow.Field<string>("Phone")
}).ToList();
EmployeeList = myList;
}
private void FillJobs(DataTable dt)
{
var myList = (from DataRow dataRow in dt.Rows
orderby dataRow.Field<DateTime>("DateSwept"),
dataRow.Field<string>("LastName"),
dataRow.Field<string>("FirstName")
select new SweeperModel()
{
Am = dataRow.Field<bool>("TimeOfDayAm"),
Pm = dataRow.Field<bool>("TimeOfDayPm"),
Block = dataRow.Field<string>("Block"),
DateSwept = dataRow.Field<DateTime>("DateSwept"),
Employee = new EmployeeModel()
{
FirstName = dataRow.Field<string>("FirstName"),
LastName = dataRow.Field<string>("LastName"),
Id = dataRow.Field<int>("EmployeeID"),
Phone = dataRow.Field<string>("Phone")
},
IntersectingStreet1 = new Streets() {StreetName = dataRow.Field<string>("IntersectingStreet1Name"),StreetID = dataRow.Field<int>("IntersectingStreet1") },
UnitsRange = dataRow.Field<string>("UnitsRange"),
Quad = dataRow.Field<string>("Quad"),
Street = new Streets() { StreetName = dataRow.Field<string>("StreetName"), StreetID = dataRow.Field<int>("StreetID") }
}).ToList();
DatesList = myList;
}
Upvotes: 0
Views: 536
Reputation: 872
You have different references to selected Street
object. One reference comes from StreetList
and another from SelectedSweeperModel.Street
(SelectedItem). So combobox trying to find selected object by reference and fails. Binding to StreetID
should solve the problem
<ComboBox Grid.Column="2"
Grid.Row="1"
ItemsSource="{Binding StreetList}"
SelectedValue="{Binding SelectedSweepModel.Street.StreetID}"
SelectedValuePath="StreetID"
DisplayMemberPath="StreetName" />
Upvotes: 1