繁体   English   中英

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");
        }
    }

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

感谢帮助!

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

此外,当您设置SelectedProgram的初始值时,是在getter中进行的,在PropertyChanged方法中不会调用PropertyChanged ,因此绑定将永远不会意识到该更改。 您可以在getter中初始化PropertyChanged时调用它:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM