ComboBox 选择的项目绑定不显示初始值 - 然后工作正常

ComboBox selected item binding not showing the initial value - then working OK

我想我有一个很简单的问题。 我有一个设置了两个绑定的组合框 - 一个用于 ItemsSource,另一个用于 SelectedItem。
所选项目在初始启动时不工作,但随后工作正常。输出没有表明任何绑定问题,我还设置了一个具有相同绑定的 TextBlock 以查看它是否有效 - 确实有效。

这是代码

  <ComboBox IsSynchronizedWithCurrentItem="True" IsEditable="False"
                          Name="ProgramsCollectionComboBox"
                          SelectedItem="{Binding ElementName=ThisUc,
                                                 Path=SelectedProgram}"
                          ItemsSource="{Binding ElementName=ThisUc,
                                                Path=ProgramsCollection}">
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" />
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>

                <TextBlock Text="{Binding ElementName=ThisUc, 
                     Path=SelectedProgram.Name, Mode=TwoWay}" />

属性:

        private Program _selectedProgram;
        public Program SelectedProgram
        {
            get
            {
                if (_selectedProgram == null)
                {
                        _selectedProgram = new Program(Settings.Default.SelectedProgramPath);
                }
                return _selectedProgram;

            }
        set
        {
                _selectedProgram = value;
                Settings.Default.SelectedProgramPath = SelectedProgram.PathProgramFolder;
                RaisePropertyChanged("SelectedProgram");
        }
    }

它保存并读取设置 OK,初始值显示在组合框下方的文本块中,当我更改所选项目时,文本块被更新,设置被更改并且一切正常 - 除了事实在应用程序启动时,所选项目未被选中。

感谢帮助!

你的 属性 SelectedProgram 的 getter 应该 return 你的 ProgrammsCollection 的值而不是新实例,如果它是空的。

如果值不是绑定到组合框的集合的一部分,则不会显示。

您的初始绑定不起作用的原因有两个。首先,正如 Jehof 自己提到的那样,您将 SelectedProgram 设置为不属于 ProgramsCollection 的项目。

此外,当您设置 SelectedProgram 的初始值时,您是在 getter 中这样做的,其中 PropertyChanged 未被调用,因此绑定永远不会被察觉那个变化。您可以在 getter:

初始化它时调用 PropertyChanged
...
get
{
    if (_selectedProgram == null)
    {
        _selectedProgram = _programsCollection?.FirstOrDefault();
        RaisePropertyChanged("SelectedProgram");
    }
    return _selectedProgram;
}
...

或者更好的是,在私有字段上设置默认值:

private Program _selectedProgram = _programsCollection?.FirstOrDefault();
...