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

时间:2015-11-20 08:10:53

标签: c# wpf binding combobox

我有一个奇怪的问题,我认为这很简单。 我有一个有两个绑定设置的组合框 - 一个用于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");
        }
    }

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

此外,当您在getter中设置SelectedProgram的初始值时,其中PropertyChanged未被调用,因此绑定将永远不会知道该更改。您可以在getter中初始化它时调用PropertyChanged

...
get
{
    if (_selectedProgram == null)
    {
        _selectedProgram = _programsCollection?.FirstOrDefault();
        RaisePropertyChanged("SelectedProgram");
    }
    return _selectedProgram;
}
...

甚至更好,在私人字段上设置默认值:

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

答案 1 :(得分:0)

属性SelectedProgram的getter应返回ProgrammsCollection的值,如果为null,则返回新实例。

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