WPF Combobox初始值被选定项目覆盖

时间:2018-04-07 13:13:51

标签: c# wpf xaml caliburn.micro

我有以下问题:

当我的视图加载时,组合框选择的值为空。

problem

以下是我的观点代码:

<UserControl.Resources>
    ...
    <CollectionViewSource x:Key="SpecialtiesSource" Source="{Binding Path=Specialties}" />
    ...
</UserControl.Resources>

...

<ComboBox Grid.Row="11" Grid.Column="2" Name="Specialty" Style="{StaticResource ComboBoxItem}"
          SelectedIndex="0"
          IsEditable="True"
          TextSearch.TextPath="Name"
          DisplayMemberPath="Name" 
          ItemsSource="{Binding Source={StaticResource SpecialtiesSource}}" 
          SelectedItem="{Binding SelectedSpecialty}"
          SelectedValuePath="Name">
</ComboBox>

这是我的观点模型:

private List<Specialty> _specialties;
public List<Specialty> Specialties
{
    get
    {
        return _specialties;
    }

    set
    {
            _specialties = value;
            NotifyOfPropertyChange(() => Specialties);
        }
    }

    private Specialty _selectedSpecialty;
    public Specialty SelectedSpecialty
    {
        get
        {
            return _selectedSpecialty;
        }

        set
        {
            if (value == null)
            {
                return;
            }

            _selectedSpecialty = value;
            NotifyOfPropertyChange(() => SelectedSpecialty);
        }
    }

型号:

public class Specialty : IGeneric
{
    public string Code { get; set; }
    public string Name { get; set; }
    public string TabColour { get; set; }
    public string TextColour { get; set; }
    public bool? ActiveFlag { get; set; }
}

public interface IGeneric
{
    string Name { get; set; }
}

当我调试代码时,我可以看到我的Specialties对象返回了正确的结果,因为当我点击下拉菜单时,我可以看到所有结果,如我所料。

然而,在加载了这个对象之后,我立即看到我的SelectedSpecialty对象被命中为null。我猜这是因为加载ItemsSource之间的某些底层交互,然后尝试在索引位置0设置SelectedItem的值?

关于如何确定为什么设置SelectedItem以及如何正确停止/设置我的SpecialtiesSource的第一项的任何输入或建议?

我也没有100%自信我正确使用了SelectedValuePath。

1 个答案:

答案 0 :(得分:0)

绑定的SelectedItem从null开始。与ItemsSource相同。如果您看到列表,则必须在问题中未显示的地方初始化Specialties,只需在此之后设置SelectedSpecialty。

或者,如果它是在运行时加载的静态列表,则在get for Specialties中创建列表。然后,您可以在运行时将SelectedSpecialty初始化为Specialties项目之一。