【发布时间】:2023-04-10 08:04:01
【问题描述】:
似乎我在使用组合框时经常遇到这个问题,所以我的问题将分为两部分,首先我做错了什么,为什么?我使用 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>
它绑定到一个名为DatesList 的ItemSource,即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); }
}
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