我在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
而我不会...需要使用上述解决方法。
答案 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 )