我无法实现反映对底层数据源所做更改的ComboBox。从我到目前为止阅读的帖子数量来看,这不是一个不寻常的问题,但我仍然无法使其工作。将新记录添加到CaseFiles集合时,在重新启动应用程序之前,它不会出现在下拉列表中。我做错了什么?
所有(EF)生成的实体都继承自实现INotifyPropertyChanged的BaseModel,而ViewModel也通过ViewModelBase实现INotifyPropertyChanged。
Combobox xaml看起来像这样:
<ComboBox x:Name="cbxSelect" Height="26" MinWidth="230"
ToolTip="DRE Number / Rolling Log Number / Operational File Number"
ItemsSource="{Binding CaseFiles}"
SelectedValue="{Binding SelectedCaseFile}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center" Foreground="DarkBlue" FontSize="14">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource NullToStringMultiConverter}">
<Binding Path="Evaluator.DreNumber"/>
<Binding Path="RollingLogNumber"/>
<Binding Path="FileNumber"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
视图模型:
public class MainViewModel : ViewModelBase
{
private MyEntites db;
private ObservableCollection<CaseFile> caseFiles;
public ObservableCollection<CaseFile> CaseFiles
{
get { return caseFiles; }
}
public MainViewModel()
{
db = new MyEntities();
caseFiles = Convert<CaseFile>(db.CaseFile.GetAll().ToList())
}
public static ObservableCollection<T> Convert<T>(IEnumerable original)
{
return new ObservableCollection<T>(original.Cast<T>());
}
}
答案 0 :(得分:1)
当新记录添加到CaseFiles集合时,它不会出现在下拉列表中,直到重新启动应用程序。我做错了什么?
您可能没有将项添加到视图模型的CaseFiles属性返回的同一ObservableCollection实例中。只有当您向此ObservableCollection实例添加项目时,新项目才会出现在ComboBox中。
例如,如果您向db.CaseFile集合添加项目,则不会影响ComboBox,因为它绑定到完全不同的集合。
在构建视图模型时,您正在创建一个全新的ObservableCollection,此后此新集合与您最初传递给静态Convert方法的List之间没有任何关联。
因此,请确保您只创建MainViewModel类的单个实例,并且实际上是将项添加到其CaseFiles属性和DbContext中。
显然,您需要提供可重现的问题样本,包括任何代码片段,如果您需要任何进一步的帮助,它们会准确显示您如何将项目实际添加到ObservableCollection中。但是,如果将ComboBox的DataContext设置或绑定到MainViewModel的实例,则将CaseFile对象添加到其CaseFiles属性应更新ComboBox。