Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#/XAML/WPF绑定部分工作,仅显示列表中的第一项_C#_Wpf_Binding - Fatal编程技术网

C#/XAML/WPF绑定部分工作,仅显示列表中的第一项

C#/XAML/WPF绑定部分工作,仅显示列表中的第一项,c#,wpf,binding,C#,Wpf,Binding,我有一个非常简单的绑定,但我看到的问题是,没有显示三个公司(company_list是一个列表,其中company包含要绑定到的company_id),我看到弹出的窗口中只显示company_list中的firstcompany_id。我有其他的绑定似乎工作得很好,在其他一些情况下,我看到我使用了ItemSource而不是DataContext,但是当我使用它时,我得到了“Items集合在使用ItemsSource之前必须为空”。我已经在stackoverflow、msdn和其他网站上广泛搜索了

我有一个非常简单的绑定,但我看到的问题是,没有显示三个公司(company_list是一个列表,其中company包含要绑定到的company_id),我看到弹出的窗口中只显示company_list中的firstcompany_id。我有其他的绑定似乎工作得很好,在其他一些情况下,我看到我使用了ItemSource而不是DataContext,但是当我使用它时,我得到了“Items集合在使用ItemsSource之前必须为空”。我已经在stackoverflow、msdn和其他网站上广泛搜索了这个问题的简单答案,并且看到了大多数我无法理解/应用的非常复杂的解决方案

当我的窗口出现时,它有:

公司

应具备的:

公司a
公司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;我以前试过,但当时也出了点问题:-)