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();
...
我想我有一个很简单的问题。
我有一个设置了两个绑定的组合框 - 一个用于 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();
...