我有一个应该非常简单的绑定(bind),但我看到的问题是,我没有显示三个公司(company_list 是一个列表,其中 Company 包含要绑定(bind)的 company_id),而是弹出窗口company_list 中只有第一个 company_id。我还有其他似乎工作正常的绑定(bind),在其他一些情况下,我发现我使用的是 ItemSource 而不是 DataContext,但是当我使用它时,我得到“在使用 ItemsSource 之前,Items 集合必须为空”。我在 stackoverflow、msdn 和其他地方广泛搜索了一个简单的答案,并且看到了大多数我无法理解/应用的非常复杂的解决方案。
当我的窗口出现时,它有:
公司A
它应该有的地方:
公司A
公司B
C公司
这是 company_list 的内容(是的,已在调试器中验证)。建议表示赞赏!随后是代码和 XAML。
ReadMasterCompanyList(); // populates a_state.company_list with 3 companies
// display company list dialog
CompanySelect cs_window = new CompanySelect();
cs_window.CompanyListView.DataContext = a_state.company_list;
// fails: cs_window.CompanyListView.ItemsSource = a_state.company_list;
cs_window.Show();
以及来自 CompanySelect 的 XAML:
<Grid>
<ListView IsSynchronizedWithCurrentItem="True"
x:Name="CompanyListView"
SelectionMode="Single" SelectionChanged="CompanyListView_SelectionChanged">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Height" Value="30"/>
</Style>
</ListView.ItemContainerStyle>
<ListViewItem Content="{Binding Path=company_id}"></ListViewItem>
</ListView>
</Grid>
最佳答案
我会在代码隐藏中设置 ListView 的 ItemsSource,而不是 DataContext:
cs_window.CompanyListView.ItemsSource = a_state.company_list;
或绑定(bind):
<ListView ItemsSource="{Binding company_list}">
然后改为设置 ListView 的 ItemTemplate。
...
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding company_id}" />
</DataTemplate>
</ListView.ItemTemplate>
...
我也会考虑使用 MVVM design pattern为了可测试性和关注点分离,并考虑使用 PascalCase 作为您的属性名称。
此外,除非您特别想要 ListView,否则我会使用 ListBox。
关于C#/XAML/WPF 绑定(bind)部分工作,仅显示列表中的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5043669/