组合框未在使用MVVM的WPF中刷新

组合框未在使用MVVM的WPF中刷新,wpf,mvvm,data-binding,combobox,refresh,Wpf,Mvvm,Data Binding,Combobox,Refresh,我有一个类似的问题 但我确实使用了INotifyPropertyChange接口,但仍然存在问题。以下是XAML: <UserControl x:Class="Sample.Module.Pages.View.ModifyDataTypeView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http

我有一个类似的问题

但我确实使用了INotifyPropertyChange接口,但仍然存在问题。以下是XAML:

<UserControl x:Class="Sample.Module.Pages.View.ModifyDataTypeView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
         xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
         xmlns:local="clr-namespace:Sample.Module.Pages.ViewModel"
         mc:Ignorable="d" 
         d:DesignHeight="500" d:DesignWidth="350">
<UserControl.DataContext>
    <local:DataTypeViewModel/>
</UserControl.DataContext>
<Canvas>
        <ComboBox Canvas.Left="0" Canvas.Top="0" 
                  Margin="13,22,0,0"
                  Style="{DynamicResource VirtualisedMetroComboBox}"
                  Controls:TextBoxHelper.Watermark="Autocompletion"
                  DisplayMemberPath="DataTypeName"
                  IsEditable="True"
                  ItemsSource="{Binding DataTypes}"
                  MaxDropDownHeight="125"
               SelectedItem="{Binding Path=SelectedDataType, Mode=TwoWay}" Height="25"/>
        </Canvas>

以下是ViewModel:

 public class DataTypeViewModel : DomainObject
{
    private ObservableCollection<DataTypeRepository> dataTypes;
    private DataTypeRepository selectedDataType;
    private DataTypeModel dataTypeModel;

    public DataTypeViewModel()
    {
        dataTypeModel = new DataTypeModel();
        selectedDataType = new DataTypeRepository();
        this.dataTypes = dataTypeModel.GetAllDataTypes();
        InsertDataTypeCommand = new DelegateCommand(OnInsertDataType);
    }
    public ObservableCollection<DataTypeRepository> DataTypes 
    { 
        get { return dataTypes; }
        set 
        {
            if (!EqualityComparer<ObservableCollection<DataTypeRepository>>.Default.Equals(dataTypes,value))
            {
                dataTypes = value;
                RaisePropertyChanged("DataTypes");
            }
        }
    }

    public DataTypeRepository SelectedDataType
    {
        get
        {
            return selectedDataType;
        }
        set
        {
            if (!EqualityComparer<DataTypeRepository>.Default.Equals(selectedDataType, value))
            {
                selectedDataType = value;
                InsertDataTypeCommand.RaiseCanExecuteChanged();
                RaisePropertyChanged("SelectedDataType");
            }
        }
    }
    public DelegateCommand InsertDataTypeCommand { get; private set; }
    private void OnInsertDataType()
    {
        DataBaseOperationStatusMessage = dataTypeModel.InsertDataType(selectedDataType);
        DatabaseOperationComplete = true;
        DataTypes = dataTypeModel.GetAllDataTypes();
    }
}
公共类DataTypeViewModel:DomainObject
{
私有可观察收集数据类型;
私有数据类型存储库选择的数据类型;
私有数据类型模型;
公共数据类型视图模型()
{
dataTypeModel=新的dataTypeModel();
selectedDataType=new DataTypeRepository();
this.dataTypes=dataTypeModel.GetAllDataTypes();
InsertDataTypeCommand=新的DelegateCommand(OnInsertDataType);
}
公共ObservableCollection数据类型
{ 
获取{返回数据类型;}
设置
{
如果(!EqualityComparer.Default.Equals(数据类型,值))
{
数据类型=值;
RaisePropertyChanged(“数据类型”);
}
}
}
公共数据类型存储库选择的数据类型
{
得到
{
返回selectedDataType;
}
设置
{
如果(!EqualityComparer.Default.Equals(selectedDataType,value))
{
selectedDataType=值;
InsertDataTypeCommand.RaiseCanExecuteChanged();
RaisePropertyChanged(“SelectedDataType”);
}
}
}
公共DelegateCommand InsertDataTypeCommand{get;private set;}
私有void OnInsertDataType()
{
DataBaseOperationStatusMessage=dataTypeModel.InsertDataType(selectedDataType);
DatabaseOperationComplete=true;
DataTypes=dataTypeModel.GetAllDataTypes();
}
}
请注意,InsertDataTypeCommand命令用于添加“数据类型”的应用程序的另一个选项卡中。添加数据类型后,用户单击“修改”选项卡以在组合框列表中查看新的数据类型。但这并没有发生。如果重新启动应用程序并转到“修改”页面,则可以看到新记录。 问题是,即使在使用INotifyPropertyChange时,组合框也没有得到更新


这里缺少什么?

尝试更新绑定以包含更新触发器

SelectedItem="{Binding Path=SelectedDataType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

我猜下面这一行不会导致集合被更新:

 DataTypes = dataTypeModel.GetAllDataTypes(); 
从您的代码来看,您可以将新项插入数据库或其他任何位置,然后运行从数据库加载所有项的方法。当您插入数据库时,最好创建相应的DataTypeRepository项并将其添加到集合中,而不是运行该方法

this.DataTypes.Add(new DataTypeRepository { property1= "somedata"}); 
这只是意味着,如果你在一个庞大的项目列表中添加一个新项目,你就不必重新加载所有内容


您可能还应该将itemsource更新为双向绑定(除非您正在执行注释中建议的只读),并将UpdateRigger设置为属性已更改(默认情况下,其焦点已丢失)

ObservableCollection属性应为只读。绝对没有必要使用支持INPC的属性公开它们。如果要从集合中添加/删除项,只需使用常规集合方法即可。这可能与你的问题有关。我理解你的意思。那么您建议将ObservableCollection的属性更改为List?我那样做没有效果。在哪里。。。怎样。。。谁我说什么???让我再看一遍我的评论。。。嗯,属性应该是只读的,是的。。。不用了,INPC,好的。。。使用正常的收集方法,嗯。。。。我相信这里的问题是你很兴奋。请把碗递给我。我正在试图解决一个问题并寻求帮助。如果你觉得这很有趣,那就到别处去笑吧。试着阅读我的评论,并按照它的建议去做。试着不要做它不建议的事情。这可能会对您有所帮助。实际上,问题不是更新集合,即数据类型;不是选择。