简体   繁体   中英

WPF MVVM Combobox Not Populating When Changing Selected Item On Another Control

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;

}

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" />

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM