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