[英]WPF MVVM Combobox Not Populating When Changing Selected Item On Another Control
似乎在使用組合框時經常遇到此問題,因此我的問題將分為兩部分:首先,我做錯了什么,為什么? 我使用Prism的原因有很多,其中之一是因為我不必鍵入viewModelBase
( INotifyPropertyChanged
類)。
我希望在視圖的左側有一個記錄列表,以使最終用戶可以輕松選擇要查看的記錄。 在這種情況下,它是一個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
是棱鏡的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
類具有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.