当更改另一个控件上的选定项时,WPF MVVM 组合框不填充

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

似乎我在使用组合框时经常遇到这个问题,所以我的问题将分为两部分,首先我做错了什么以及为什么?我使用 Prism 的原因有很多,其中之一是因为我不必输入 viewModelBase (INotifyPropertyChanged class).

我喜欢在视图的左侧有一个记录列表,以允许最终用户轻松选择要查看的记录。在这种情况下,它是 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>

它绑定到一个名为 DatesListItemSource,它是一个 List<Model>(请注意 SetProperty 是 Prism 的 INotifyPropertyChanged)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); }
    }

清扫机型号:

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; }
}

comboBox 绑定到 SweeperModel 中的 属性,名为 Street:

<ComboBox Grid.Column="2"
          Grid.Row="1"
          ItemsSource="{Binding StreetList}"
          SelectedItem="{Binding SelectedSweepModel.Street}"
          DisplayMemberPath="StreetName" />

Streets class 有 2 个属性:

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); }
    }


当我 select 一个 Item 时,组合框中没有填充任何内容。现在我的问题是,我做错了什么?

填充列表我 运行 一个存储过程 returns 一个包含 3 个表的数据集。

和填充列表的 3 种方法:

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;

}

您对所选 Street 对象有不同的引用。一个参考来自 StreetList,另一个来自 SelectedSweeperModel.Street (SelectedItem)。因此组合框试图通过引用查找所选对象但失败了。绑定到 StreetID 应该可以解决问题

<ComboBox Grid.Column="2"
      Grid.Row="1"
      ItemsSource="{Binding StreetList}"
      SelectedValue="{Binding SelectedSweepModel.Street.StreetID}"
      SelectedValuePath="StreetID"
      DisplayMemberPath="StreetName" />