簡體   English   中英

更改另一個控件上的選定項目時,不會填充WPF MVVM組合框

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

似乎在使用組合框時經常遇到此問題,因此我的問題將分為兩部分:首先,我做錯了什么,為什么? 我使用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>

它綁定到ItemSource稱為DatesList這是一個List<Model> :(請注意SetProperty是棱鏡的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); }
    }

掃地機型號:

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;

}

您對選定的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" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM