另一个ComboBox绑定无法按预期工作

时间:2016-12-19 23:35:46

标签: wpf data-binding combobox observablecollection inotifypropertychanged

我无法实现反映对底层数据源所做更改的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>());
        }
    }

1 个答案:

答案 0 :(得分:1)

  

当新记录添加到CaseFiles集合时,它不会出现在下拉列表中,直到重新启动应用程序。我做错了什么?

您可能没有将项添加到视图模型的CaseFiles属性返回的同一ObservableCollection实例中。只有当您向此ObservableCollection实例添加项目时,新项目才会出现在ComboBox中。

例如,如果您向db.CaseFile集合添加项目,则不会影响ComboBox,因为它绑定到完全不同的集合。

在构建视图模型时,您正在创建一个全新的ObservableCollection,此后此新集合与您最初传递给静态Convert方法的List之间没有任何关联。

因此,请确保您只创建MainViewModel类的单个实例,并且实际上是将项添加到其CaseFiles属性和DbContext中。

显然,您需要提供可重现的问题样本,包括任何代码片段,如果您需要任何进一步的帮助,它们会准确显示您如何将项目实际添加到ObservableCollection中。但是,如果将ComboBox的DataContext设置或绑定到MainViewModel的实例,则将CaseFile对象添加到其CaseFiles属性应更新ComboBox。