在Listview中显示ObservableCollection

时间:2018-11-30 12:47:17

标签: c# wpf xaml

我一直在努力使它起作用。

我不认为这是重复的,因为我发现没有其他帖子有此问题或帮助我解决了我的问题,但是如果重复,我表示歉意。

我有一个从另一个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应该显示在构造函数中输入的“测试”。

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中,但为空,不包含任何文本,如下图所示。黑色是我的样式资源,因为选择它来显示已创建一项。

Picture

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

在Gridview中使用Xaml:

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

Working GridView

如您所见,这在ID列中正确显示了“测试”。但是,我希望能够显示不带任何列的列表,并能够应用所需的格式。任何想法为何第一种方法行不通?

权利只是一小类,包含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>

2 个答案:

答案 0 :(得分:0)

看来ListView的样式是造成此问题的原因。正确删除样式会显示数据:

No Style

但是我不确定样式的哪一部分会阻塞显示。如果这不适用于其他人,我应该删除问题吗?

答案 1 :(得分:0)

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

改为使用ContentPresenter

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