绑定到ObservableCollection时如何更新组合框



我是WPF的新手,正在尝试将ComboBox与ObservableCollection绑定。Bing显示了正确的值,当我尝试从同一页面添加新值时,组合框会更新。当我试图将另一个PageTest组合框中的一个新项目添加到集合中时,该组合框不显示新值,只显示旧值。我做错了什么?这是我的第一个ComboBox组合测试窗口。

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ComboBox ItemsSource="{Binding ObservableCollection}" Width="200" Height="50">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Price}"></TextBlock>
<TextBlock Text="{Binding BuildingType.A, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
<TextBlock Text="{Binding BuildingType.B, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
<TextBlock Text="{Binding BuildingType.C, UpdateSourceTrigger=PropertyChanged}"></TextBlock>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Grid.Column="1" Click="ButtonBase_OnClick" Width="100" Height="100"> To next page</Button>
</Grid>

此窗口的代码隐藏:

public partial class ComboTest : Page
{ 
ComboViewModel temp = new ComboViewModel();
public ComboTest()
{
InitializeComponent();
DataContext = temp;
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{          
NavigationService.Navigate(new PageTest(temp));
}
}

这是我的视图模型:

public class ComboViewModel
{
public ObservableCollection<Building> ObservableCollection { get; set; } = new ObservableCollection<Building>()
{
new Building()
{
Price = "250",
BuildingType = new BuildingType() {A = "BuildingTypeA", B = "BuildingTypeA", C = "BuildingTypeA"}
},
new Building()
{
Price = "250",
BuildingType = new BuildingType() {A = "BuildingTypeB", B = "BuildingTypeB", C = "BuildingTypeB"}
},
new Building()
{
Price = "250",
BuildingType = new BuildingType() {A = "BuildingTypeC", B = "BuildingTypeC", C = "BuildingTypeC"}
}
};
public  void AddItem()
{
ObservableCollection.Add(new Building()
{
Price = "250",
BuildingType = new BuildingType() { A = "BuildingTypeC", B = "BuildingTypeC", C = "BuildingTypeC" }
});
}
}

另一页:

<Grid>
<Button Width="200" Height="100" Click="ButtonBase_OnClick">Add and Navigate Back</Button>
</Grid>

以及此页面的代码

public partial class PageTest : Page
{
private ComboViewModel temp;
//public PageTest()
//{
//    InitializeComponent();
//}
public PageTest(ComboViewModel comboViewModel)
{
temp = comboViewModel;
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
temp.AddItem();
NavigationService.GoBack();
}
}

当您导航回时,会创建一个新的combotest实例,因此对集合所做的更改将丢失。

实现这一点的一种方法是设置根页面的keepalive属性(combotest(。

KeepAlive="True"

查看此导航概述#PageLifetime

最新更新