【问题标题】:WPF MVVM Combobox Not Populating When Changing Selected Item On Another Control更改另一个控件上的选定项目时未填充 WPF MVVM 组合框
【发布时间】:2023-04-10 08:04:01
【问题描述】:

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

我喜欢在视图左侧有一个记录列表,以便最终用户轻松选择要查看的记录。在这种情况下,它是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&lt;Model&gt;(请注意SetProperty 是Prism 的INotifyPropertyChangedSelectedSweepModel

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

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

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

Streets 类有 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); }
    }


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

填充列表 我运行一个存储过程,它返回一个包含 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;

}

【问题讨论】:

  • 属性 {Binding StreetList} 来自哪里?
  • 我将编辑我的帖子以添加
  • 了解DataContext 类以及如何填充列表会很有帮助。

标签: c# wpf mvvm combobox prism


【解决方案1】:

您对选定的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" />

【讨论】:

  • 多谢前辈,我该怎么做?
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2016-01-19
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多