WPF ListView 控件已填充但不可见

Posted

技术标签:

【中文标题】WPF ListView 控件已填充但不可见【英文标题】:WPF ListView control is populated but invisible 【发布时间】:2011-08-03 10:23:03 【问题描述】:

我有一个 ListView,其中填充了指向登录历史列表的 ItemsSource,这样我就可以从以前的成功登录中进行选择,而不必重新输入用户、主机等。这似乎工作正常,但由于某种原因,现在数据绑定工作正常,但控件中的项目是不可见的。我可以告诉控件正在正确填充,因为项目的“幽灵”可用并在我将鼠标悬停在它们上时突出显示,在我的 ItemsSource 中以正确的数字,并且它们被正确绑定 - 例如,如果我的 ItemsSource 有 LoginA、LoginQ、和 LoginZ 并单击第二个“不可见”项目,LoginQ 发生。我试过弄乱不透明度,改变 ItemsSource 的绑定位置(在登录对话框出现之后/之前等)。没有喜悦。与较旧的工作版本相比,我看不到任何似乎相关的内容。欢迎提示、建议和嘘声.....

【问题讨论】:

你能发布列表视图的 xaml 吗? 【参考方案1】:

听起来你的列表项类型中的属性要么不是真正的属性(它们可能是公共字段,你不能绑定到它),或者它们的值稍后在你的代码中改变并且你还没有实现INotifyPropertyChanged通知 XAML 绑定引擎它们的值已更新。

【讨论】:

【参考方案2】:

devdigital 的回答帮助我找到了问题;我试图绑定到我的 LoginHistory 类中的字段,这些字段被定义为:

公共字符串 foo;

我之前将字段定义为:

公共字符串 foo get;放;

但在我遇到可访问性问题时更改了它们,并且从未将它们改回来。有 得到;放; 定义允许它们再次对数据绑定可见。 Ken(我是 OP,但不知何故,这个问题最初是作为“新用户”发布的,所以我认为我不能将这些标记为已回答)。

【讨论】:

【参考方案3】:

我遇到了同样的问题,问题出在绑定中,在 xaml 文件中。

<GridViewColumn Header="Category" Width="Auto" DisplayMemberBinding="Binding yourVariable"/>

我在 (xaml.cs) 后面的代码中更改了一些行,但在 xaml 中没有更改,因此 binding 无法正常工作(xaml.cs 中的 listView 已填充,但 WPF 没有'不知道如何将它们放在 xaml 中的 ListView 中)。

当我在 xaml 中修复该问题时,ListView 中的行变为可见。

【讨论】:

【参考方案4】:

这是我的 ItemsSource 的类:List,以及引用它的 XAML。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++ 公共类登录历史 公共字符串用户; 公共字符串主机; 公共字符串公司; 等等等等等等.........

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++

            <Border Name="mask" Opacity="0.8"  Background="White" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" CornerRadius="0,0,0,10"/>
            <ListView Background="White" BorderThickness="0" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
                      IsSynchronizedWithCurrentItem="True" HorizontalAlignment="Stretch" 
                      x:Name="HistoryListView" VerticalAlignment="Stretch" Width="Auto" 
                      Height="Auto" FontSize="14" SelectionMode="Single"
                      SelectionChanged="HistoryListView_SelectionChanged">
                <ListView.OpacityMask>
                    <VisualBrush Visual="Binding ElementName=mask"/>
                </ListView.OpacityMask>
                <ListView.ItemContainerStyle>
                    <Style TargetType="x:Type ListViewItem">
                        <Setter Property="Height" Value="40"/>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.View>
                    <!--
                    <GridView ColumnHeaderTemplate="StaticResource HeaderTemplateNoArrow" AllowsColumnReorder="True">
                        -->

用户

                        <GridViewColumn DisplayMemberBinding="Binding Path=company">
                            <GridViewColumnHeader>Company</GridViewColumnHeader>
                        </GridViewColumn>

                        <GridViewColumn DisplayMemberBinding="Binding Path=host">
                            <GridViewColumnHeader>Host</GridViewColumnHeader>
                        </GridViewColumn>

                    </GridView>
                </ListView.View>
            </ListView>
            <Border BorderThickness="1" Margin="0" BorderBrush="Gray" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" CornerRadius="0,0,0,10">
            </Border>

【讨论】:

如我的回答中所述,您似乎使用的是公共字段而不是属性。您不能绑定到字段。通过添加 getter 和 setter 将字段更改为属性。

以上是关于WPF ListView 控件已填充但不可见的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF ListView 中,如何防止自动滚动?

如何有条件地更改数据绑定 WPF ListView 的 CellTemplate 中控件的属性?

WPF绑定到Listview的Itemtemplate的可见性不起作用[重复]

〝WPF〞中的〝ListBox〞、〝ListView〞和〝DataGridView〞有啥区别?

WPF中的ListBox,ListView和DataGridView有啥区别

将 WPF 控件设置为扩展以填充可用空间,仅此而已