我有一个奇怪的问题,我认为这很简单。 我有一个有两个绑定设置的组合框 - 一个用于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");
}
}
它保存并读取设置确定,初始值显示在组合框下方的文本块中,当我更改所选项目时,文本块被更新,设置被更改,一切正常 - 除了事实上应用启动时,未选择所选项目。
感谢您的帮助!
答案 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,则返回新实例。
如果该值不是绑定到组合框的集合的一部分,则不会显示该值。