C#/XAML/WPF绑定部分工作,仅显示列表中的第一项
我有一个非常简单的绑定,但我看到的问题是,没有显示三个公司(company_list是一个列表,其中company包含要绑定到的company_id),我看到弹出的窗口中只显示company_list中的firstcompany_id。我有其他的绑定似乎工作得很好,在其他一些情况下,我看到我使用了ItemSource而不是DataContext,但是当我使用它时,我得到了“Items集合在使用ItemsSource之前必须为空”。我已经在stackoverflow、msdn和其他网站上广泛搜索了这个问题的简单答案,并且看到了大多数我无法理解/应用的非常复杂的解决方案 当我的窗口出现时,它有: 公司 应具备的: 公司aC#/XAML/WPF绑定部分工作,仅显示列表中的第一项,c#,wpf,binding,C#,Wpf,Binding,我有一个非常简单的绑定,但我看到的问题是,没有显示三个公司(company_list是一个列表,其中company包含要绑定到的company_id),我看到弹出的窗口中只显示company_list中的firstcompany_id。我有其他的绑定似乎工作得很好,在其他一些情况下,我看到我使用了ItemSource而不是DataContext,但是当我使用它时,我得到了“Items集合在使用ItemsSource之前必须为空”。我已经在stackoverflow、msdn和其他网站上广泛搜索了
公司b
公司 这是公司列表的内容(是,在调试器中验证)。感谢您的建议!下面是代码和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>
问题是,您在XAML代码中定义了一个ListViewItem。你不应该这样做。
试着这样做:
<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>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Content={Binding Path=company_id}/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
首先,仅在cs\u window.Show()之后设置DataContext 其次,您作为孩子在ListView的XAML中拥有的ListViewItem是您只看到一个的原因 第三,如果您在XAML中定义ItemsSource,可能工作得更好(而且会更MVVM化),如下所示:
<ListView ItemsSource="{Binding Path=company_list}" ...>
这是在对ListView容器的DataContext或其他某个祖先元素进行_声明之后进行的。我将在codebehind中设置ListView的ItemsSource,而不是DataContext:
cs_window.CompanyListView.ItemsSource = a_state.company_list;
或具有约束力:
<ListView ItemsSource="{Binding company_list}">
然后改为设置ListView的ItemTemplate
...
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding company_id}" />
</DataTemplate>
</ListView.ItemTemplate>
...
。。。
...
我还将研究如何使用PascalCase实现可测试性和关注点分离,以及如何将PascalCase用于属性名称
另外,除非您特别想要ListView,否则我会使用ListBox。谢谢,这很有帮助。请注意,“TextBlock”似乎没有内容属性,它是Text=“{Binding company_id}”。另外,为什么建议使用ListBox与ListView?我遇到的一个问题是,现在我的ListView显示了所有3家公司,第一家公司被自动选中-我想显示这些公司,默认情况下没有一家公司被选中。您可以根据需要设置SelectedItem属性。有关ListView/ListBox之间的差异,请参见我能够按照建议在cs_window.Show()之后设置ItemSource。酷!我将按照建议在XAML中尝试ItemsSource;我以前试过,但当时也出了点问题:-)