【发布时间】:2020-02-20 07:49:48
【问题描述】:
我在 Page 中做一个 Combobox 的简单绑定:
XAML:
<ComboBox x:Name="Cmb_test" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Left" ItemsSource="{Binding}" />
背后的代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
//Binding of label works fine everytime
My_label.Content = dt.Rows[0]["Column1"];
Cmb_test.DataContext = dt.DefaultView;
Cmb_test.SelectedValuePath = dt.Columns[3].ToString();
Cmb_test.DisplayMemberPath = dt.Columns[4].ToString();
//Just a check to see whether DataTable really has changed
Console.WriteLine(dt.Rows.Count.ToString());
}
但每当我的 DataTable "dt" 发生变化时,我的 Combobox 就不再显示项目。我知道关于这个问题已经提出了很多问题,但我能找到的只是与运行时刷新相关的问题。在我的情况下,我关闭一个页面并在 DataTable 更改时重新打开它,但结果是空的组合框。
关闭我的页面的代码,以供补充:
代码与组合框在同一页面中:
private void BtnClose_Click(object sender, RoutedEventArgs e)
{
Cmb_test.ItemsSource = null;
Cmb_test.DataContext = null;
var main_window = Application.Current.MainWindow;
var frame = (main_window as MainWindow).My_Frame;
frame.Content = null;
}
主窗口中的代码:
private void My_Frame_Navigated(object sender, NavigationEventArgs e)
{
if (My_Frame.Content == null)
{
My_Frame.RemoveBackEntry();
}
}
编辑 - 再次尝试:
XAML:
<Page.Resources>
<CollectionViewSource x:Key="My_source"/>
</Page.Resources>
<ComboBox x:Name="Cmb_test" ItemsSource="{Binding Source={StaticResource My_source}}" DisplayMemberPath="Column1"/>
后面的代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var combo_datasource = new CollectionViewSource();
combo_datasource = (CollectionViewSource)this.FindResource("seznamVrstEvidenc");
combo_datasource.Source = Tabele.dt_Sifrant.DefaultView;
}
这里发生了什么,如何修复组合框以每次都显示它的项目?
【问题讨论】:
-
每当您的数据表发生更改时,您到底是什么意思?当你做什么时......组合框中没有任何项目。
-
顺便说一句.. 除非这是一个“向导”,否则您正在构建用户想要通过和返回的步骤。我推荐使用 contentcontrol 和 usercontrol 而不是框架框架和页面,而不是使用框架。我还将数据表转换为类型化列表或 observablecollection,以便您拥有属性名称而不是列索引。而且...即使 ui 是完全动态的,当前的建议是从 xaml 将 ui 构建为字符串或模板。
-
@Andy,我的 DataTable - 可以在我的一个窗口中更改 Combobox 的来源。为此,我必须先关闭我的页面。 DataTable get 的变化,我可以在除 Combobox 之外的所有其他绑定控件(文本框、标签、数据网格)中看到这些变化。你能给我看一些简单的可观察集合示例吗?
-
如果您有麻烦,那么最简单的步骤更改就是使用像 Dapper 这样的微型计算机。 Dapper 为您提供了一系列扩展方法,使数据访问更简单。您可以为数据行定义视图模型。然后,您可以填写这些列表。 Observablecollection 有一个构造函数接受一个列表。您可以使用各种集合视图进行过滤和排序。
-
还有。在视图模型上实现 inotifypropertychanged。如果您绑定到一个作为集合视图的公共属性,您还需要引发一个属性更改事件,以便绑定“知道”您将该集合视图切换到一个新的。
标签: c# wpf combobox itemsource