为什么我的组合框无法绑定到我的 ViewModel 中的 List<string>? WPF
Why is my combobox failing to bind to my List<string> in my ViewModel? WPF
我的 XAML 中有四个组合框。它看起来像这样:
<ComboBox Grid.Row="2" ItemsSource="{Binding VehiclesAvailable}" DisplayMemberPath="FleetNumber"/>
<ComboBox Grid.Row="3" ItemsSource="{Binding Employees_VehicleEligible}" DisplayMemberPath="FullName"/>
<ComboBox Grid.Row="4" ItemsSource="{Binding Jobsites}" DisplayMemberPath="Name"/>
<ComboBox Grid.Row="5" ItemsSource="{Binding Conditions}" SelectedItem="{Binding SelectedCondition}" />
前三个 CB 绑定到 ObservableCollection 属性,这些工作正常。
最后一个绑定了List,不显示任何内容
在 VM 中,我声明 属性 并在 LoadInitialData 命令中设置它的值。
//PROPERTIES
public ObservableCollection<VehicleModel> VehiclesAvailable { get; set; }
public ObservableCollection<EmployeeModel> Employees_VehicleEligible { get; set; }
public ObservableCollection<JobsiteModel> Jobsites { get; set; }
public ConditionsModel Conditions { get; set; }
public GenericCondition SelectedConditionOut { get; set; }
public string SelectedCondition { get; set; }
//COMMANDs
public RelayCommand<object> LoadIntialDataCommand { get; set; }
//METHODS
public async void LoadInitialData(object e)
{
var vehiclesAvailable = await GetData.VehiclesAvailableQueryAsync();
foreach (VehicleModel _vehicle in vehiclesAvailable)
VehiclesAvailable.Add(_vehicle);
var employees_VehiclesEligible = await GetData.Employees_VehiclesEligibleQueryAsync();
foreach (EmployeeModel _employee in employees_VehiclesEligible)
Employees_VehicleEligible.Add(_employee);
Conditions = new ConditionsModel();
}
为了它的价值,这是我定义 ConditionsModel 的地方:
class ConditionsModel
{
private List<string> _conditions;
public List<string> Conditions
{
get { return new List<string>() { "New", "Excellent", "Good", "Fair", "Poor", "Unacceptable" }; }
set { _conditions = value; }
}
当我单步执行代码时,在 LoadInitialData 方法的右括号处放置一个断点,Conditions 似乎填充了所有字符串。当我转到 XAML 时,果然,当我将鼠标悬停在 ItemsSource 属性 上时,所有字符串都会出现。但是当我 运行 它时,组合框是空的。调试此问题的下一步可能是什么?
您的绑定似乎是 ConditionsModel
而不是 ConditionsModel.Conditions
属性。
除此之外 ObservableCollection
将在更新时触发 NotifyPropertyChange
事件,而标准 List
不会。
由 RelayCommand
触发,您的 LoadInitialData(...)
函数将在创建并显示视图后调用。如果您已经在 ViewModel 构造函数中创建并填充了 Conditions
,那么您可能会看到一些值。
在这种情况下,您最好使用 ConditionsViewModel Conditions
而不是 ConditionsModel Conditions
属性,其中 ConditionsViewModel
使用 ObservableCollection<string> Conditions
然后绑定到 ConditionsViewModel.Conditions
您当前绑定的 Conditions
属性 没有 return IEnumerable
ItemsSource
属性 .
您应该绑定到 ConditionsModel
的 Conditions
列表 属性:
<ComboBox Grid.Row="5" ItemsSource="{Binding Conditions.Conditions}"
SelectedItem="{Binding SelectedCondition}" />
我的 XAML 中有四个组合框。它看起来像这样:
<ComboBox Grid.Row="2" ItemsSource="{Binding VehiclesAvailable}" DisplayMemberPath="FleetNumber"/>
<ComboBox Grid.Row="3" ItemsSource="{Binding Employees_VehicleEligible}" DisplayMemberPath="FullName"/>
<ComboBox Grid.Row="4" ItemsSource="{Binding Jobsites}" DisplayMemberPath="Name"/>
<ComboBox Grid.Row="5" ItemsSource="{Binding Conditions}" SelectedItem="{Binding SelectedCondition}" />
前三个 CB 绑定到 ObservableCollection 属性,这些工作正常。 最后一个绑定了List,不显示任何内容
在 VM 中,我声明 属性 并在 LoadInitialData 命令中设置它的值。
//PROPERTIES
public ObservableCollection<VehicleModel> VehiclesAvailable { get; set; }
public ObservableCollection<EmployeeModel> Employees_VehicleEligible { get; set; }
public ObservableCollection<JobsiteModel> Jobsites { get; set; }
public ConditionsModel Conditions { get; set; }
public GenericCondition SelectedConditionOut { get; set; }
public string SelectedCondition { get; set; }
//COMMANDs
public RelayCommand<object> LoadIntialDataCommand { get; set; }
//METHODS
public async void LoadInitialData(object e)
{
var vehiclesAvailable = await GetData.VehiclesAvailableQueryAsync();
foreach (VehicleModel _vehicle in vehiclesAvailable)
VehiclesAvailable.Add(_vehicle);
var employees_VehiclesEligible = await GetData.Employees_VehiclesEligibleQueryAsync();
foreach (EmployeeModel _employee in employees_VehiclesEligible)
Employees_VehicleEligible.Add(_employee);
Conditions = new ConditionsModel();
}
为了它的价值,这是我定义 ConditionsModel 的地方:
class ConditionsModel
{
private List<string> _conditions;
public List<string> Conditions
{
get { return new List<string>() { "New", "Excellent", "Good", "Fair", "Poor", "Unacceptable" }; }
set { _conditions = value; }
}
当我单步执行代码时,在 LoadInitialData 方法的右括号处放置一个断点,Conditions 似乎填充了所有字符串。当我转到 XAML 时,果然,当我将鼠标悬停在 ItemsSource 属性 上时,所有字符串都会出现。但是当我 运行 它时,组合框是空的。调试此问题的下一步可能是什么?
您的绑定似乎是 ConditionsModel
而不是 ConditionsModel.Conditions
属性。
除此之外 ObservableCollection
将在更新时触发 NotifyPropertyChange
事件,而标准 List
不会。
由 RelayCommand
触发,您的 LoadInitialData(...)
函数将在创建并显示视图后调用。如果您已经在 ViewModel 构造函数中创建并填充了 Conditions
,那么您可能会看到一些值。
在这种情况下,您最好使用 ConditionsViewModel Conditions
而不是 ConditionsModel Conditions
属性,其中 ConditionsViewModel
使用 ObservableCollection<string> Conditions
然后绑定到 ConditionsViewModel.Conditions
您当前绑定的 Conditions
属性 没有 return IEnumerable
ItemsSource
属性 .
您应该绑定到 ConditionsModel
的 Conditions
列表 属性:
<ComboBox Grid.Row="5" ItemsSource="{Binding Conditions.Conditions}"
SelectedItem="{Binding SelectedCondition}" />