【问题标题】:Displaying ObservableCollection in Listview在 Listview 中显示 ObservableCollection
【发布时间】:2019-05-02 15:08:08
【问题描述】:

我一直在努力让它发挥作用。

我不认为这是重复的,因为我发现没有其他帖子有这个问题或帮助我解决我的问题,但如果它是重复的,我很抱歉。

我有一个继承自另一个 UserControl 的 UserControl。这个孩子需要显示我基地的其他孩子不存在或不需要的项目列表。

C#:

public partial class EntitlementUserControl : BaseUserControl
{
  public ObservableCollection<Entitlement> EntitlementCollection { get; set; } = new ObservableCollection<Entitlement>();

  public EntitlementUserControl()
  {
    InitializeComponent();
    this.DataContext = this;
    EntitlementCollection.Add(new Entitlement("Test"));
  }
}

这里的EntitlementID应该显示在构造函数中输入的“Test”。

WPF:

    <ListView x:Name="entitlementList" ItemsSource="{Binding EntitlementCollection}" >
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid Columns="5" HorizontalAlignment="Stretch"/>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ListView.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Path=EntitlementID}"/>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

这对我不起作用,我发现 this 解释了我需要 DataContext,但即使使用它,它也无法正确显示我的值。 ListView 中显示了一个项目,但它是空的并且不包含任何文本,如下图所示。黑色是我的样式资源,因为它被选中以显示一个项目已创建。

但是,如果我将 XAML 更改为在列表视图中使用 Gridview,它会显示我的数据,但我的目标是格式化数据,而不是显示网格。

使用 Gridview 使用 Xaml:

<ListView x:Name="entitlementList" ItemsSource="{Binding EntitlementCollection}" >
  <ListView.View>
  <GridView>
    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding EntitlementID}"/>
  </GridView>
  </ListView.View>
</ListView>

如您所见,这在 ID 列中正确显示了“测试”。但是,我希望能够显示没有任何列的列表,并且能够应用我想要的格式。任何想法为什么第一种方法不起作用?

Entitlement 只是一个包含 ID 和产品列表的小类。 权利:

public class Entitlement
{
  List<Product> products;

  public List<Product> Products { get => products; set => products = value; }
  public string EntitlementID { get => entitlementID; set => entitlementID = value; }

  string entitlementID;

  public void AddProduct(Product product)
  {
    Products.Add(product);
  }

  public Entitlement(string entitlementID)
  {
    products = new List<Product>();
    this.entitlementID = entitlementID;
  }

  public override string ToString()
  {
    return EntitlementID;
  }
}

如果您需要更多代码,请告诉我。

用于 ListView 的样式(非我制作,为我提供):

<Style TargetType="{x:Type ListViewItem}"  >
<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="{x:Type ListViewItem}">
      <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" CornerRadius="2"
              SnapsToDevicePixels="true">
        <Border x:Name="InnerBorder" CornerRadius="1" BorderThickness="1">
          <Grid>
            <Grid.RowDefinitions>
              <RowDefinition MinHeight="18"/>
              <RowDefinition/>
            </Grid.RowDefinitions>
            <Rectangle x:Name="UpperHighlight" Visibility="Collapsed" Fill="{StaticResource UpperReflection_Normal_BackgroundBrush}"/>
            <GridViewRowPresenter Grid.RowSpan="2" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
          </Grid>
        </Border>
      </Border>
      <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
          <Setter Property="Background" Value="{StaticResource FlatButton_MouseOver_BackgroundBrush}"/>
          <Setter Property="BorderBrush" Value="{StaticResource FlatButton_MouseOver_BorderBrush}"/>
          <Setter Property="BorderBrush" TargetName="InnerBorder" Value="{StaticResource FlatButton_MouseOver_InnerBorderBrush}" />
          <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible"/>
        </Trigger>
        <!--<Trigger Property="Helpers:ItemDragState.IsUnderDragCursor" Value="True">
          <Setter Property="Background" Value="{StaticResource ListViewItem_Hover_BackgroundBrush}"/>
          <Setter Property="BorderBrush" Value="{StaticResource ListViewItem_Hover_BorderBrush}"/>
          <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible"/>
        </Trigger>-->
        <Trigger Property="IsSelected" Value="true">
          <Setter Property="Background" Value="{StaticResource ListItemSelectedFill_BackgroundBrush}"/>
          <Setter Property="BorderBrush" Value="{StaticResource ListItemSelectedFill_BorderBrush}"/>
                        <Setter Property="Foreground" Value="White" />
                        <Setter TargetName="InnerBorder" Property="BorderBrush" Value="{StaticResource ListViewItem_Selected_InnerBorderBrush}"/>
          <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible"/>
          <Setter TargetName="UpperHighlight" Property="Fill" Value="#40FFFFFF"/>
        </Trigger>
        <MultiTrigger>
          <MultiTrigger.Conditions>
            <Condition Property="IsSelected" Value="true"/>
            <Condition Property="Selector.IsSelectionActive" Value="false"/>
          </MultiTrigger.Conditions>
          <Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill_BackgroundBrush}"/>
          <Setter Property="BorderBrush" Value="{StaticResource ListItemSelectedInactiveFill_BorderBrush}"/>
        </MultiTrigger>
        <MultiTrigger>
          <MultiTrigger.Conditions>
            <Condition Property="IsSelected" Value="true"/>
            <Condition Property="IsMouseOver" Value="true"/>
          </MultiTrigger.Conditions>
          <Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill_BackgroundBrush}"/>
          <Setter Property="BorderBrush" Value="{StaticResource ListItemSelectedHoverFill_BorderBrush}"/>
        </MultiTrigger>
        <Trigger Property="IsEnabled" Value="false">
          <Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Setter.Value>
</Setter>

【问题讨论】:

  • A UserControl 不应像您的代码那样拥有自己的 DataContextUserControl 应该是可重用的,因此应该从其父级继承数据上下文或从其父级显式获取数据上下文。
  • 我不确定它是否应该拥有它自己的 DataContext 但我尝试了它,因为我链接到的帖子说它会有所帮助,所以包括它以避免任何“尝试设置 DataContext”厘米。
  • 现在我觉得自己很笨。风格导致了这个问题。无论如何我都会发布它以尝试找出原因,但删除样式解决了问题。

标签: c# wpf xaml


【解决方案1】:

您的ListViewItem 的样式使用GridViewRowPresenter。如果没有GridView,您确实不会在单元格中看到任何内容。

改用ContentPresenter

<ContentPresenter Grid.RowSpan="2" 
    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

【讨论】:

  • 谢谢!这完美地工作,显示数据,我可以保持 ListView 上的样式。标记为答案。
【解决方案2】:

似乎 ListView 的样式是导致问题的原因。删除样式正确显示数据:

No Style

我不确定样式的哪一部分挡住了显示。如果这不适用于其他人,我应该删除这个问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多