Отображение ObservableCollection в Listview - PullRequest
0 голосов
/ 30 ноября 2018

Я некоторое время пытался заставить это работать.

Я не думаю, что это дубликат, так как ни одна другая найденная мной статья не имела этой проблемы или не помогла мне решить мою, но еслиэто дубликат, я прошу прощения.

У меня есть 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>

Это не работает для меня, я нашел этот , который объяснил, что мне нужен DataContext, но даже с этим он не 'не правильно отображать мои значения.Элемент отображается в ListView, но он пуст и не содержит никакого текста, рисунок ниже.Черный - мой ресурс стиля, потому что он выбран, чтобы показать, что создан один элемент.

Picture

Однако, если я изменю XAML, чтобы вместо него иметь Gridview в списке, он отображает мойданные, но моя цель - отформатировать данные, а не показывать сетку.

Работа Xaml с Gridview:

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

Working GridView

Как видите, этоправильно показывает «Тест» в столбце 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 голосов
/ 30 ноября 2018

Ваш стиль ListViewItem использует GridViewRowPresenter.Без GridView вы действительно не увидите никакого содержимого в своих ячейках.

Вместо этого используйте ContentPresenter:

<ContentPresenter Grid.RowSpan="2" 
    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
0 голосов
/ 30 ноября 2018

Кажется, что стиль для ListView является причиной проблемы.При удалении стиля правильно отображаются данные:

Без стиля

Однако я не уверен, какая часть стиля блокирует отображение.Если это не относится к кому-либо еще, я должен снять вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...