当更改另一个控件上的选定项时,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>
它绑定到一个名为 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); }
}
清扫机型号:
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" />
似乎我在使用组合框时经常遇到这个问题,所以我的问题将分为两部分,首先我做错了什么以及为什么?我使用 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>
它绑定到一个名为 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); }
}
清扫机型号:
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" />