【问题标题】:ComboBox selected item binding not showing the initial value - then working OKComboBox 选定项绑定未显示初始值 - 然后工作正常
【发布时间】:2016-02-22 15:43:12
【问题描述】:

我想我对一些简单的事情有一个奇怪的问题。 我有一个组合框,其中设置了两个绑定 - 一个用于 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,初始值显示在组合框下方的文本块中,当我更改所选项目时,文本块被更新,设置被更改并且一切正常 - 除了 on应用启动,选择的项目没有被选中。

感谢您的帮助!

【问题讨论】:

  • 你的属性的 getter 应该返回你的 ProgramsCollection 的值,而不是一个新的实例,如果它是空的
  • @Jehof 在初始启动时,它应该为空,因此无论如何它应该返回新的Program
  • 是的,但新 Programm 不属于您的 ProgrammsCollection。这就是为什么不显示初始值,而是显示之后的原因

标签: c# wpf binding combobox


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2020-01-24
      • 2017-04-02
      • 1970-01-01
      • 2016-06-06
      • 2013-06-09
      相关资源
      最近更新 更多