我是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