集合更新后WPF ComboBox刷新

时间:2015-04-26 16:14:54

标签: c# wpf combobox

我在ComboBox中使用wpf,如下所示,并希望在看到if if update集合后面更新ComboBox: -

     <xmlns:dataProvider="clr-namespace:DataProvider"
     <UserControl.Resources>
        <dataProvider:BackOfficeDataProvider x:Key="DataProvider"/>
     </UserControl.Resources>
    <ComboBox x:Name="groupGroupNameCombo" HorizontalAlignment="Left" Margin="368,123,0,0" VerticalAlignment="Top" Width="226" Height="31" SelectionChanged="groupGroupNameCombo_SelectionChanged"    DisplayMemberPath="GroupName" SelectedItem="{Binding ParentID, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding GroupParentList, Mode=TwoWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, Source={StaticResource DataProvider}}" IsSynchronizedWithCurrentItem="True">

                        </ComboBox>

    Class BackOfficeDataProvider {
    public static ObservableCollection<Categories> groupParentList = null;
    public virtual ObservableCollection<Categories> GroupParentList
            {
                get { return groupParentList ; }
                set
                {
                    groupParentList = value;
                    // Call OnPropertyChanged whenever the property is updated
                    OnPropertyChanged("GroupParentList");
                }
            }

    public void loadComboListData();
    {
    GroupParentList = (ObservableCollection<Categories>) //fetching data from database using NHibernate directly getting list ;
    }
}

我的前端类有刷新按钮: -

private void RefreshButton_Click(object sender, RoutedEventArgs e)
        {
          new BackOfficeDataProvider().loadComboListData();
        }

当应用程序加载那段时间我可以看到combobox中的项目,但是当我点击刷新按钮时,它从数据库加载更新的数据但没有更新combobox,直到我使用下面的代码

groupGroupNameCombo.ItemsSource = null;
groupGroupNameCombo.ItemSource = GroupParentList ;

这是我必须要做的手动事情,我总是要刷新combobox,如何让它自动化,就像我更新集合然后它应该同时更新combobox而我不会...需要使用上述解决方法。

3 个答案:

答案 0 :(得分:0)

我认为这可能与在执行此操作时打破组合框和ObservableCollection之间的耦合有关:

GroupParentList = //fetching data from database;

请改为尝试:

var dbCategories = // Get data from DB
GroupParentList.Clear(); 
foreach (var item in dbData)
    GroupParentList.Add(item);

重点是更新集合中的项目,而不是集合本身。

另外,尝试像这样定义你的集合,它应该不止一次实例化(即没有setter):

public static ObservableCollection<Categories> groupParentList = null;
public virtual ObservableCollection<Categories> GroupParentList
{
    get 
    {
        if (groupParentList == null)
            groupParentList = new ObservableCollection<Categories>();
        return groupParentList; 
    }
}

答案 1 :(得分:0)

Hogler是对的,您将新的ObservableCollection对象分配给绑定属性的方法将破坏绑定的工作方式。要使ObservableCollection工作,您需要修改集合本身中的项,ObservableCollection负责将绑定目标的列表更改发布。将新集合分配给绑定目标时,除非再次发布PropertyChanged事件以注册此新绑定源,否则列表将不会刷新。

在您之后的评论中,您确实声明仅仅实例化一次ObservableCollection,这在您发布的代码中并不明显。在我看来,它不起作用的原因是因为你为&#34; GroupParentList&#34;分配了一个新的集合。每次运行&#34; loadComboListData&#34;。

答案 2 :(得分:-2)

试试这个.. 完成从groupParentList中的数据库中获取数据后,在下面的行中添加,它将按以下方式工作: -

GroupParentList = new ObservableCollection<Categories>(groupParentList )